Compare commits
5 Commits
bc40f9abe3
...
socket
| Author | SHA1 | Date | |
|---|---|---|---|
| 7a471041e7 | |||
| ab57d8ef22 | |||
| 69c9d80a82 | |||
| 8c83819a17 | |||
| ad07bf7fe6 |
140
.github/upgrades/dotnet-upgrade-plan.md
vendored
@ -1,70 +1,70 @@
|
|||||||
# .NET 8.0 Upgrade Plan
|
# .NET 8.0 Upgrade Plan
|
||||||
|
|
||||||
## Execution Steps
|
## Execution Steps
|
||||||
|
|
||||||
Execute steps below sequentially one by one in the order they are listed.
|
Execute steps below sequentially one by one in the order they are listed.
|
||||||
|
|
||||||
1. Validate that an .NET 8.0 SDK required for this upgrade is installed on the machine and if not, help to get it installed.
|
1. Validate that an .NET 8.0 SDK required for this upgrade is installed on the machine and if not, help to get it installed.
|
||||||
2. Ensure that the SDK version specified in global.json files is compatible with the .NET 8.0 upgrade.
|
2. Ensure that the SDK version specified in global.json files is compatible with the .NET 8.0 upgrade.
|
||||||
3. Upgrade ClipTrimDotNet\ClipTrimDotNet.csproj
|
3. Upgrade ClipTrimDotNet\ClipTrimDotNet.csproj
|
||||||
4. Run unit tests to validate upgrade in the projects listed below:
|
4. Run unit tests to validate upgrade in the projects listed below:
|
||||||
- ClientTest\ClientTest.csproj
|
- ClientTest\ClientTest.csproj
|
||||||
|
|
||||||
## Settings
|
## Settings
|
||||||
|
|
||||||
This section contains settings and data used by execution steps.
|
This section contains settings and data used by execution steps.
|
||||||
|
|
||||||
### Excluded projects
|
### Excluded projects
|
||||||
|
|
||||||
| Project name | Description |
|
| Project name | Description |
|
||||||
|:-----------------------------------------------|:---------------------------:|
|
|:-----------------------------------------------|:---------------------------:|
|
||||||
|
|
||||||
### Aggregate NuGet packages modifications across all projects
|
### Aggregate NuGet packages modifications across all projects
|
||||||
|
|
||||||
NuGet packages used across all selected projects or their dependencies that need version update in projects that reference them.
|
NuGet packages used across all selected projects or their dependencies that need version update in projects that reference them.
|
||||||
|
|
||||||
| Package Name | Current Version | New Version | Description |
|
| Package Name | Current Version | New Version | Description |
|
||||||
|:------------------------------------|:---------------:|:-----------:|:----------------------------------------------|
|
|:------------------------------------|:---------------:|:-----------:|:----------------------------------------------|
|
||||||
| Microsoft.Bcl.AsyncInterfaces | 10.0.2 | 8.0.0 | Recommended for .NET 8.0 |
|
| Microsoft.Bcl.AsyncInterfaces | 10.0.2 | 8.0.0 | Recommended for .NET 8.0 |
|
||||||
| Microsoft.Extensions.DependencyInjection | 10.0.2 | 8.0.1 | Recommended for .NET 8.0 |
|
| Microsoft.Extensions.DependencyInjection | 10.0.2 | 8.0.1 | Recommended for .NET 8.0 |
|
||||||
| Microsoft.Extensions.DependencyInjection.Abstractions | 10.0.2 | 8.0.2 | Recommended for .NET 8.0 |
|
| Microsoft.Extensions.DependencyInjection.Abstractions | 10.0.2 | 8.0.2 | Recommended for .NET 8.0 |
|
||||||
| Microsoft.Extensions.Logging | 10.0.2 | 8.0.1 | Recommended for .NET 8.0 |
|
| Microsoft.Extensions.Logging | 10.0.2 | 8.0.1 | Recommended for .NET 8.0 |
|
||||||
| Microsoft.Extensions.Logging.Abstractions | 10.0.2 | 8.0.3 | Recommended for .NET 8.0 |
|
| Microsoft.Extensions.Logging.Abstractions | 10.0.2 | 8.0.3 | Recommended for .NET 8.0 |
|
||||||
| Microsoft.Extensions.Options | 10.0.2 | 8.0.2 | Recommended for .NET 8.0 |
|
| Microsoft.Extensions.Options | 10.0.2 | 8.0.2 | Recommended for .NET 8.0 |
|
||||||
| Microsoft.Extensions.Primitives | 10.0.2 | 8.0.0 | Recommended for .NET 8.0 |
|
| Microsoft.Extensions.Primitives | 10.0.2 | 8.0.0 | Recommended for .NET 8.0 |
|
||||||
| System.Diagnostics.DiagnosticSource | 10.0.2 | 8.0.1 | Recommended for .NET 8.0 |
|
| System.Diagnostics.DiagnosticSource | 10.0.2 | 8.0.1 | Recommended for .NET 8.0 |
|
||||||
| System.Drawing.Common | 9.0.10 | 8.0.24 | Recommended for .NET 8.0 |
|
| System.Drawing.Common | 9.0.10 | 8.0.24 | Recommended for .NET 8.0 |
|
||||||
| System.IO.Pipelines | 10.0.2 | 8.0.0 | Recommended for .NET 8.0 |
|
| System.IO.Pipelines | 10.0.2 | 8.0.0 | Recommended for .NET 8.0 |
|
||||||
| System.Security.AccessControl | 4.7.0 | 6.0.1 | Recommended for .NET 8.0 |
|
| System.Security.AccessControl | 4.7.0 | 6.0.1 | Recommended for .NET 8.0 |
|
||||||
| System.Text.Encodings.Web | 10.0.2 | 8.0.0 | Recommended for .NET 8.0 |
|
| System.Text.Encodings.Web | 10.0.2 | 8.0.0 | Recommended for .NET 8.0 |
|
||||||
| System.Text.Json | 10.0.2 | 8.0.6 | Recommended for .NET 8.0 |
|
| System.Text.Json | 10.0.2 | 8.0.6 | Recommended for .NET 8.0 |
|
||||||
| Microsoft.Win32.Registry | 4.7.0 | | Functionality included with framework |
|
| Microsoft.Win32.Registry | 4.7.0 | | Functionality included with framework |
|
||||||
| System.Buffers | 4.6.1 | | Functionality included with framework |
|
| System.Buffers | 4.6.1 | | Functionality included with framework |
|
||||||
| System.IO | 4.3.0 | | Functionality included with framework |
|
| System.IO | 4.3.0 | | Functionality included with framework |
|
||||||
| System.Memory | 4.6.3 | | Functionality included with framework |
|
| System.Memory | 4.6.3 | | Functionality included with framework |
|
||||||
| System.Net.Http | 4.3.4 | | Functionality included with framework |
|
| System.Net.Http | 4.3.4 | | Functionality included with framework |
|
||||||
| System.Numerics.Vectors | 4.6.1 | | Functionality included with framework |
|
| System.Numerics.Vectors | 4.6.1 | | Functionality included with framework |
|
||||||
| System.Runtime | 4.3.0 | | Functionality included with framework |
|
| System.Runtime | 4.3.0 | | Functionality included with framework |
|
||||||
| System.Security.Cryptography.Algorithms | 4.3.0 | | Functionality included with framework |
|
| System.Security.Cryptography.Algorithms | 4.3.0 | | Functionality included with framework |
|
||||||
| System.Security.Cryptography.Encoding | 4.3.0 | | Functionality included with framework |
|
| System.Security.Cryptography.Encoding | 4.3.0 | | Functionality included with framework |
|
||||||
| System.Security.Cryptography.Primitives | 4.3.0 | | Functionality included with framework |
|
| System.Security.Cryptography.Primitives | 4.3.0 | | Functionality included with framework |
|
||||||
| System.Security.Cryptography.X509Certificates | 4.3.0 | | Functionality included with framework |
|
| System.Security.Cryptography.X509Certificates | 4.3.0 | | Functionality included with framework |
|
||||||
| System.Security.Principal.Windows | 4.7.0 | | Functionality included with framework |
|
| System.Security.Principal.Windows | 4.7.0 | | Functionality included with framework |
|
||||||
| System.Threading.Tasks.Extensions | 4.6.3 | | Functionality included with framework |
|
| System.Threading.Tasks.Extensions | 4.6.3 | | Functionality included with framework |
|
||||||
| System.ValueTuple | 4.6.1 | | Functionality included with framework |
|
| System.ValueTuple | 4.6.1 | | Functionality included with framework |
|
||||||
|
|
||||||
### Project upgrade details
|
### Project upgrade details
|
||||||
|
|
||||||
#### ClipTrimDotNet\ClipTrimDotNet.csproj modifications
|
#### ClipTrimDotNet\ClipTrimDotNet.csproj modifications
|
||||||
|
|
||||||
Project properties changes:
|
Project properties changes:
|
||||||
- Target framework should be changed from `.NETFramework,Version=v4.8` to `net8.0`
|
- Target framework should be changed from `.NETFramework,Version=v4.8` to `net8.0`
|
||||||
- Project file should be converted to SDK-style
|
- Project file should be converted to SDK-style
|
||||||
|
|
||||||
NuGet packages changes:
|
NuGet packages changes:
|
||||||
- Update all packages listed in the NuGet packages table above as recommended
|
- Update all packages listed in the NuGet packages table above as recommended
|
||||||
- Remove packages whose functionality is now included with the framework
|
- Remove packages whose functionality is now included with the framework
|
||||||
|
|
||||||
Other changes:
|
Other changes:
|
||||||
- Ensure compatibility with .NET 8.0 APIs and features
|
- Ensure compatibility with .NET 8.0 APIs and features
|
||||||
- Update code as needed for breaking changes
|
- Update code as needed for breaking changes
|
||||||
|
|||||||
4
.vscode/settings.json
vendored
@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"idf.pythonInstallPath": "C:\\Users\\mickl\\.espressif\\tools\\idf-python\\3.11.2\\python.exe"
|
"idf.pythonInstallPath": "C:\\Users\\mickl\\.espressif\\tools\\idf-python\\3.11.2\\python.exe"
|
||||||
}
|
}
|
||||||
@ -1,34 +1,134 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "Uncategorized",
|
"name": "Uncategorized",
|
||||||
"id": 0,
|
"id": 0,
|
||||||
"clips": []
|
"clips": [
|
||||||
},
|
{
|
||||||
{
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_195932.wav",
|
||||||
"name": "Test",
|
"name": "Clip 20260226_195932",
|
||||||
"id": 1,
|
"playbackType": "playOverlap",
|
||||||
"clips": []
|
"volume": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "New",
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260228_165611.wav",
|
||||||
"id": 2,
|
"name": "Clip 20260228_165611",
|
||||||
"clips": [
|
"playbackType": "playStop",
|
||||||
{
|
"volume": 1.0
|
||||||
"endTime": 30,
|
},
|
||||||
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260220_193822.wav",
|
{
|
||||||
"name": "Pee pee\npoo poo",
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260228_165646.wav",
|
||||||
"playbackType": "playOverlap",
|
"name": "Clip 20260228_165646",
|
||||||
"startTime": 27.76674010920584,
|
"playbackType": "playStop",
|
||||||
"volume": 0.25
|
"volume": 1.0
|
||||||
},
|
}
|
||||||
{
|
]
|
||||||
"endTime": 27.516843118383072,
|
},
|
||||||
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260220_200442.wav",
|
{
|
||||||
"name": "Clip 20260220_200442",
|
"name": "Test",
|
||||||
"playbackType": "playOverlap",
|
"id": 1,
|
||||||
"startTime": 25.120307988450435,
|
"clips": [
|
||||||
"volume": 0.64
|
{
|
||||||
}
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_183812.wav",
|
||||||
]
|
"name": "Clip 20260226_183812",
|
||||||
}
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_183607.wav",
|
||||||
|
"name": "Clip 20260226_183607",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_183822.wav",
|
||||||
|
"name": "Clip 20260226_183822",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184028.wav",
|
||||||
|
"name": "Clip 20260226_184028",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184030.wav",
|
||||||
|
"name": "Clip 20260226_184030",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184032.wav",
|
||||||
|
"name": "Clip 20260226_184032",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184037.wav",
|
||||||
|
"name": "Clip 20260226_184037",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184040.wav",
|
||||||
|
"name": "Clip 20260226_184040",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184041.wav",
|
||||||
|
"name": "Clip 20260226_184041",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184042.wav",
|
||||||
|
"name": "Clip 20260226_184042",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260228_092721.wav",
|
||||||
|
"name": "Clip 20260228_092721",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1,
|
||||||
|
"startTime": 6.438382145377559,
|
||||||
|
"endTime": 14.277258292166426
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "New",
|
||||||
|
"id": 2,
|
||||||
|
"clips": [
|
||||||
|
{
|
||||||
|
"endTime": 30,
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260220_193822.wav",
|
||||||
|
"name": "Pee pee\npoo poo",
|
||||||
|
"playbackType": "playOverlap",
|
||||||
|
"startTime": 27.64044943820222,
|
||||||
|
"volume": 0.31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"endTime": 30,
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260220_200442.wav",
|
||||||
|
"name": "Test",
|
||||||
|
"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
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260228_120955.wav",
|
||||||
|
"name": "nose",
|
||||||
|
"playbackType": "playStop",
|
||||||
|
"volume": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
@ -1,7 +1,6 @@
|
|||||||
sounddevice==0.5.1
|
Flask==3.1.3
|
||||||
numpy==1.22.3
|
flask_cors==6.0.2
|
||||||
python-osc==1.9.3
|
flask_socketio==5.6.1
|
||||||
scipy==1.10.1
|
numpy==2.4.2
|
||||||
comtypes==1.4.8
|
scipy==1.17.1
|
||||||
pycaw==20240210
|
sounddevice==0.5.5
|
||||||
Flask==3.1.2
|
|
||||||
|
|||||||
@ -1,17 +1,17 @@
|
|||||||
{
|
{
|
||||||
"input_device": {
|
"input_device": {
|
||||||
"channels": 2,
|
"channels": 2,
|
||||||
"default_samplerate": 48000,
|
"default_samplerate": 48000,
|
||||||
"index": 55,
|
"index": 55,
|
||||||
"name": "VM Mic mix (VB-Audio Voicemeeter VAIO)"
|
"name": "VM Mic mix (VB-Audio Voicemeeter VAIO)"
|
||||||
},
|
},
|
||||||
"save_path": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings",
|
"save_path": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings",
|
||||||
"recording_length": 30,
|
"recording_length": 30,
|
||||||
"output_device": {
|
"output_device": {
|
||||||
"channels": 2,
|
"channels": 2,
|
||||||
"default_samplerate": 48000,
|
"default_samplerate": 48000,
|
||||||
"index": 44,
|
"index": 45,
|
||||||
"name": "VM to Headset (VB-Audio Voicemeeter VAIO)"
|
"name": "VM to Discord (VB-Audio Voicemeeter VAIO)"
|
||||||
},
|
},
|
||||||
"http_port": 5010
|
"http_port": 5010
|
||||||
}
|
}
|
||||||
@ -1,168 +1,168 @@
|
|||||||
import sounddevice as sd
|
import sounddevice as sd
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import os
|
import os
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import scipy.io.wavfile as wavfile
|
import scipy.io.wavfile as wavfile
|
||||||
from metadata_manager import MetaDataManager
|
from metadata_manager import MetaDataManager
|
||||||
from audio_clip import AudioClip
|
from audio_clip import AudioClip
|
||||||
|
|
||||||
|
|
||||||
# AudioClip class for clip playback
|
# AudioClip class for clip playback
|
||||||
|
|
||||||
|
|
||||||
class AudioIO:
|
class AudioIO:
|
||||||
_instance = None
|
_instance = None
|
||||||
|
|
||||||
def __new__(cls, *args, **kwargs):
|
def __new__(cls, *args, **kwargs):
|
||||||
if cls._instance is None:
|
if cls._instance is None:
|
||||||
# print("Creating new AudioRecorder instance")
|
# print("Creating new AudioRecorder instance")
|
||||||
cls._instance = super().__new__(cls)
|
cls._instance = super().__new__(cls)
|
||||||
cls._instance.init()
|
cls._instance.init()
|
||||||
return cls._instance
|
return cls._instance
|
||||||
def init(self):
|
def init(self):
|
||||||
self.duration = 30
|
self.duration = 30
|
||||||
self.channels = 2
|
self.channels = 2
|
||||||
self.input_sample_rate = 44100
|
self.input_sample_rate = 44100
|
||||||
self.output_sample_rate = 44100
|
self.output_sample_rate = 44100
|
||||||
self.buffer = np.zeros((int(self.duration * self.input_sample_rate), self.channels), dtype=np.float32)
|
self.buffer = np.zeros((int(self.duration * self.input_sample_rate), self.channels), dtype=np.float32)
|
||||||
self.recordings_dir = "recordings"
|
self.recordings_dir = "recordings"
|
||||||
|
|
||||||
sd.default.latency = 'low'
|
sd.default.latency = 'low'
|
||||||
|
|
||||||
self.socket = None
|
self.socket = None
|
||||||
|
|
||||||
self.in_stream = sd.InputStream(
|
self.in_stream = sd.InputStream(
|
||||||
callback=self.record_callback
|
callback=self.record_callback
|
||||||
)
|
)
|
||||||
|
|
||||||
self.out_stream = sd.OutputStream(
|
self.out_stream = sd.OutputStream(
|
||||||
callback=self.playback_callback,
|
callback=self.playback_callback,
|
||||||
latency=3
|
latency=3
|
||||||
)
|
)
|
||||||
|
|
||||||
self.clip_map = {}
|
self.clip_map = {}
|
||||||
|
|
||||||
|
|
||||||
def refresh_streams(self):
|
def refresh_streams(self):
|
||||||
was_active = self.in_stream.active
|
was_active = self.in_stream.active
|
||||||
if was_active:
|
if was_active:
|
||||||
self.in_stream.stop()
|
self.in_stream.stop()
|
||||||
self.out_stream.stop()
|
self.out_stream.stop()
|
||||||
|
|
||||||
self.buffer = np.zeros((int(self.duration * self.input_sample_rate), self.channels), dtype=np.float32)
|
self.buffer = np.zeros((int(self.duration * self.input_sample_rate), self.channels), dtype=np.float32)
|
||||||
# print(f"AudioRecorder initialized with duration={self.duration}s, sample_rate={self.sample_rate}Hz, channels={self.channels}")
|
# print(f"AudioRecorder initialized with duration={self.duration}s, sample_rate={self.sample_rate}Hz, channels={self.channels}")
|
||||||
self.in_stream = sd.InputStream(
|
self.in_stream = sd.InputStream(
|
||||||
callback=self.record_callback
|
callback=self.record_callback
|
||||||
)
|
)
|
||||||
|
|
||||||
self.out_stream = sd.OutputStream(
|
self.out_stream = sd.OutputStream(
|
||||||
callback=self.playback_callback
|
callback=self.playback_callback
|
||||||
)
|
)
|
||||||
|
|
||||||
if was_active:
|
if was_active:
|
||||||
self.in_stream.start()
|
self.in_stream.start()
|
||||||
self.out_stream.start()
|
self.out_stream.start()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def record_callback(self, indata, frames, time, status):
|
def record_callback(self, indata, frames, time, status):
|
||||||
if status:
|
if status:
|
||||||
# print(f"Recording status: {status}")
|
# print(f"Recording status: {status}")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Circular buffer implementation
|
# Circular buffer implementation
|
||||||
self.buffer = np.roll(self.buffer, -frames, axis=0)
|
self.buffer = np.roll(self.buffer, -frames, axis=0)
|
||||||
self.buffer[-frames:] = indata
|
self.buffer[-frames:] = indata
|
||||||
|
|
||||||
def playback_callback(self, outdata, frames, time, status):
|
def playback_callback(self, outdata, frames, time, status):
|
||||||
if status:
|
if status:
|
||||||
# print(f"Playback status: {status}")
|
# print(f"Playback status: {status}")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
outdata.fill(0)
|
outdata.fill(0)
|
||||||
|
|
||||||
# Iterate over a copy of the items to avoid modifying the dictionary during iteration
|
# Iterate over a copy of the items to avoid modifying the dictionary during iteration
|
||||||
for clip_id, clip_list in list(self.clip_map.items()):
|
for clip_id, clip_list in list(self.clip_map.items()):
|
||||||
for clip in clip_list[:]: # Iterate over a copy of the list
|
for clip in clip_list[:]: # Iterate over a copy of the list
|
||||||
if not clip.is_finished():
|
if not clip.is_finished():
|
||||||
samples = clip.get_samples(frames)
|
samples = clip.get_samples(frames)
|
||||||
outdata[:] += samples.reshape(-1, 1) # Mix into output
|
outdata[:] += samples.reshape(-1, 1) # Mix into output
|
||||||
if clip.is_finished():
|
if clip.is_finished():
|
||||||
self.clip_map[clip_id].remove(clip)
|
self.clip_map[clip_id].remove(clip)
|
||||||
if len(self.clip_map[clip_id]) == 0:
|
if len(self.clip_map[clip_id]) == 0:
|
||||||
del self.clip_map[clip_id]
|
del self.clip_map[clip_id]
|
||||||
break # Exit inner loop since the key is deleted
|
break # Exit inner loop since the key is deleted
|
||||||
|
|
||||||
|
|
||||||
def save_last_n_seconds(self):
|
def save_last_n_seconds(self):
|
||||||
# Create output directory if it doesn't exist
|
# Create output directory if it doesn't exist
|
||||||
os.makedirs(self.recordings_dir, exist_ok=True)
|
os.makedirs(self.recordings_dir, exist_ok=True)
|
||||||
|
|
||||||
# Generate filename with timestamp
|
# Generate filename with timestamp
|
||||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||||
filename = os.path.join(self.recordings_dir, f"audio_capture_{timestamp}.wav")
|
filename = os.path.join(self.recordings_dir, f"audio_capture_{timestamp}.wav")
|
||||||
|
|
||||||
# Normalize audio to prevent clipping
|
# Normalize audio to prevent clipping
|
||||||
audio_data = self.buffer / np.max(np.abs(self.buffer)) * .5
|
audio_data = self.buffer / np.max(np.abs(self.buffer)) * .5
|
||||||
|
|
||||||
# Convert float32 to int16 for WAV file
|
# Convert float32 to int16 for WAV file
|
||||||
audio_data_int16 = (audio_data * 32767).astype(np.int16)
|
audio_data_int16 = (audio_data * 32767).astype(np.int16)
|
||||||
|
|
||||||
# Write buffer to file
|
# Write buffer to file
|
||||||
wavfile.write(filename, int(self.input_sample_rate), audio_data_int16)
|
wavfile.write(filename, int(self.input_sample_rate), audio_data_int16)
|
||||||
|
|
||||||
meta = MetaDataManager()
|
meta = MetaDataManager()
|
||||||
|
|
||||||
clip_metadata = {
|
clip_metadata = {
|
||||||
"filename": filename,
|
"filename": filename,
|
||||||
"name": f"Clip {timestamp}",
|
"name": f"Clip {timestamp}",
|
||||||
"playbackType":"playStop",
|
"playbackType":"playStop",
|
||||||
"volume": 1.0,
|
"volume": 1.0,
|
||||||
}
|
}
|
||||||
|
|
||||||
meta.add_clip_to_collection("Uncategorized", clip_metadata )
|
meta.add_clip_to_collection("Uncategorized", clip_metadata )
|
||||||
|
self.socket.emit('new_clip', clip_metadata)
|
||||||
|
|
||||||
return clip_metadata
|
return clip_metadata
|
||||||
|
|
||||||
def set_buffer_duration(self, duration):
|
def set_buffer_duration(self, duration):
|
||||||
self.duration = duration
|
self.duration = duration
|
||||||
self.buffer = np.zeros((int(duration * self.input_sample_rate), self.channels), dtype=np.float32)
|
self.buffer = np.zeros((int(duration * self.input_sample_rate), self.channels), dtype=np.float32)
|
||||||
|
|
||||||
def set_recording_directory(self, directory):
|
def set_recording_directory(self, directory):
|
||||||
self.recordings_dir = directory
|
self.recordings_dir = directory
|
||||||
|
|
||||||
def start_recording(self):
|
def start_recording(self):
|
||||||
if(self.in_stream.active):
|
if(self.in_stream.active):
|
||||||
# print("Already recording")
|
# print("Already recording")
|
||||||
return
|
return
|
||||||
# print('number of channels', self.channels)
|
# print('number of channels', self.channels)
|
||||||
|
|
||||||
self.in_stream.start()
|
self.in_stream.start()
|
||||||
self.out_stream.start()
|
self.out_stream.start()
|
||||||
self.output_sample_rate = self.out_stream.samplerate
|
self.output_sample_rate = self.out_stream.samplerate
|
||||||
self.input_sample_rate = self.in_stream.samplerate
|
self.input_sample_rate = self.in_stream.samplerate
|
||||||
|
|
||||||
def stop_recording(self):
|
def stop_recording(self):
|
||||||
if(not self.in_stream.active):
|
if(not self.in_stream.active):
|
||||||
# print("Already stopped")
|
# print("Already stopped")
|
||||||
return
|
return
|
||||||
|
|
||||||
self.in_stream.stop()
|
self.in_stream.stop()
|
||||||
self.out_stream.stop()
|
self.out_stream.stop()
|
||||||
|
|
||||||
def is_recording(self):
|
def is_recording(self):
|
||||||
return self.in_stream.active
|
return self.in_stream.active
|
||||||
|
|
||||||
def play_clip(self, clip_metadata):
|
def play_clip(self, clip_metadata):
|
||||||
print(f"Playing clip: {clip_metadata}")
|
print(f"Playing clip: {clip_metadata}")
|
||||||
clip_id = clip_metadata.get("filename")
|
clip_id = clip_metadata.get("filename")
|
||||||
if clip_metadata.get("playbackType") == "playStop":
|
if clip_metadata.get("playbackType") == "playStop":
|
||||||
if clip_id in self.clip_map:
|
if clip_id in self.clip_map:
|
||||||
del self.clip_map[clip_id]
|
del self.clip_map[clip_id]
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
self.clip_map[clip_id] = []
|
self.clip_map[clip_id] = []
|
||||||
if clip_id not in self.clip_map:
|
if clip_id not in self.clip_map:
|
||||||
self.clip_map[clip_id] = []
|
self.clip_map[clip_id] = []
|
||||||
self.clip_map[clip_id].append(AudioClip(clip_metadata, target_sample_rate=self.output_sample_rate))
|
self.clip_map[clip_id].append(AudioClip(clip_metadata, target_sample_rate=self.output_sample_rate))
|
||||||
@ -1,85 +1,94 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from audio_io import AudioIO
|
from audio_io import AudioIO
|
||||||
from windows_audio import WindowsAudioManager
|
from windows_audio import WindowsAudioManager
|
||||||
import sounddevice as sd
|
import sounddevice as sd
|
||||||
from metadata_manager import MetaDataManager
|
from metadata_manager import MetaDataManager
|
||||||
from settings import SettingsManager
|
from settings import SettingsManager
|
||||||
|
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
|
|
||||||
from routes.recording import recording_bp
|
from routes.recording import recording_bp
|
||||||
from routes.device import device_bp
|
from routes.device import device_bp
|
||||||
from routes.metadata import metadata_bp
|
from routes.metadata import metadata_bp
|
||||||
from routes.settings import settings_bp
|
from routes.settings import settings_bp
|
||||||
from flask_socketio import SocketIO, emit
|
from flask_socketio import SocketIO, emit
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
CORS(app)
|
CORS(app)
|
||||||
socketio = SocketIO(app, cors_allowed_origins="*")
|
socketio = SocketIO(app, cors_allowed_origins="*", logger=True, engineio_logger=True, async_mode='eventlet')
|
||||||
|
|
||||||
@socketio.on('connect')
|
@socketio.on('connect')
|
||||||
def handle_connect():
|
def handle_connect():
|
||||||
print("Client connected")
|
print("Client connected")
|
||||||
emit('full_data', MetaDataManager().collections)
|
emit('full_data', MetaDataManager().collections)
|
||||||
|
|
||||||
@socketio.on('record_clip')
|
@socketio.on('record_clip')
|
||||||
def record_clip(data):
|
def record_clip():
|
||||||
io = AudioIO()
|
io = AudioIO()
|
||||||
io.save_last_n_seconds();
|
io.save_last_n_seconds();
|
||||||
|
|
||||||
def main():
|
@socketio.on('play_clip')
|
||||||
# Create argument parser
|
def play_clip(data):
|
||||||
parser = argparse.ArgumentParser(description='Audio Recording Service')
|
io = AudioIO()
|
||||||
|
print(f"Received play_clip event with data: {data}")
|
||||||
# OSC port argument
|
if data:
|
||||||
parser.add_argument('--osc-port',
|
io.play_clip(data)
|
||||||
type=int,
|
|
||||||
help='OSC server port number',
|
|
||||||
default=5010)
|
def main():
|
||||||
|
# Create argument parser
|
||||||
# Parse arguments
|
parser = argparse.ArgumentParser(description='Audio Recording Service')
|
||||||
args = parser.parse_args()
|
|
||||||
audio_manager = WindowsAudioManager()
|
# OSC port argument
|
||||||
settings = SettingsManager()
|
parser.add_argument('--osc-port',
|
||||||
meta = MetaDataManager()
|
type=int,
|
||||||
|
help='OSC server port number',
|
||||||
|
default=5010)
|
||||||
|
|
||||||
# Ensure save path exists
|
# Parse arguments
|
||||||
os.makedirs(settings.get_settings('save_path'), exist_ok=True)
|
args = parser.parse_args()
|
||||||
|
audio_manager = WindowsAudioManager()
|
||||||
|
settings = SettingsManager()
|
||||||
io = AudioIO()
|
meta = MetaDataManager()
|
||||||
io.start_recording()
|
|
||||||
|
|
||||||
# settings.socket = socketio
|
|
||||||
io.socket = socketio
|
# Ensure save path exists
|
||||||
meta.socket = socketio
|
os.makedirs(settings.get_settings('save_path'), exist_ok=True)
|
||||||
|
|
||||||
# Register blueprints
|
|
||||||
app.register_blueprint(recording_bp)
|
io = AudioIO()
|
||||||
app.register_blueprint(device_bp)
|
io.start_recording()
|
||||||
app.register_blueprint(metadata_bp)
|
|
||||||
app.register_blueprint(settings_bp)
|
# settings.socket = socketio
|
||||||
# app.run(host='127.0.0.1', port=settings.get_settings('http_port'), debug=False, use_reloader=True)
|
io.socket = socketio
|
||||||
socketio.run(app, host='127.0.0.1', port=settings.get_settings('http_port'), debug=False, use_reloader=True)
|
meta.socket = socketio
|
||||||
|
|
||||||
|
# Register blueprints
|
||||||
|
app.register_blueprint(recording_bp)
|
||||||
# Run the OSC server
|
app.register_blueprint(device_bp)
|
||||||
# try:
|
app.register_blueprint(metadata_bp)
|
||||||
# print(f"Starting OSC Recording Server on port {args.osc_port}")
|
app.register_blueprint(settings_bp)
|
||||||
# # osc_server.run_server()
|
print(f"Starting Flask server on port {settings.get_settings('http_port')}")
|
||||||
# except KeyboardInterrupt:
|
# app.run(host='127.0.0.1', port=settings.get_settings('http_port'), debug=False, use_reloader=True)
|
||||||
# print("\nServer stopped by user.")
|
socketio.run(app, host='127.0.0.1', port=settings.get_settings('http_port'), debug=False, use_reloader=True, allow_unsafe_werkzeug=True)
|
||||||
# except Exception as e:
|
|
||||||
# print(f"Error starting server: {e}")
|
|
||||||
# sys.exit(1)
|
|
||||||
|
# Run the OSC server
|
||||||
|
# try:
|
||||||
if __name__ == "__main__":
|
# print(f"Starting OSC Recording Server on port {args.osc_port}")
|
||||||
|
# # osc_server.run_server()
|
||||||
|
# except KeyboardInterrupt:
|
||||||
|
# print("\nServer stopped by user.")
|
||||||
|
# except Exception as e:
|
||||||
|
# print(f"Error starting server: {e}")
|
||||||
|
# sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
@ -1,20 +1,20 @@
|
|||||||
{
|
{
|
||||||
"Uncategorized": [
|
"Uncategorized": [
|
||||||
{
|
{
|
||||||
"endTime": 12.489270386266055,
|
"endTime": 12.489270386266055,
|
||||||
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\src\\recordings\\audio_capture_20260214_133540.wav",
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\src\\recordings\\audio_capture_20260214_133540.wav",
|
||||||
"name": "Clip 20260214_133540",
|
"name": "Clip 20260214_133540",
|
||||||
"playbackType": "playStop",
|
"playbackType": "playStop",
|
||||||
"startTime": 10.622317596566523,
|
"startTime": 10.622317596566523,
|
||||||
"volume": 1
|
"volume": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"endTime": 6.824034334763957,
|
"endTime": 6.824034334763957,
|
||||||
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\src\\recordings\\audio_capture_20260214_133137.wav",
|
"filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\src\\recordings\\audio_capture_20260214_133137.wav",
|
||||||
"name": "Clip 20260214_133137",
|
"name": "Clip 20260214_133137",
|
||||||
"playbackType": "playStop",
|
"playbackType": "playStop",
|
||||||
"startTime": 3.7982832618025753,
|
"startTime": 3.7982832618025753,
|
||||||
"volume": 1
|
"volume": 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -1,103 +1,114 @@
|
|||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
|
||||||
class MetaDataManager:
|
class MetaDataManager:
|
||||||
_instance = None
|
_instance = None
|
||||||
|
|
||||||
def __new__(cls, *args, **kwargs):
|
def __new__(cls, *args, **kwargs):
|
||||||
if cls._instance is None:
|
if cls._instance is None:
|
||||||
cls._instance = super().__new__(cls)
|
cls._instance = super().__new__(cls)
|
||||||
cls._instance.init()
|
cls._instance.init()
|
||||||
return cls._instance
|
return cls._instance
|
||||||
def init(self):
|
def init(self):
|
||||||
self.socket = None
|
self.socket = None
|
||||||
# read metadata file from executing directory
|
# read metadata file from executing directory
|
||||||
self.metadata_file = os.path.join(os.getcwd(), "metadata.json")
|
self.metadata_file = os.path.join(os.getcwd(), "metadata.json")
|
||||||
if os.path.exists(self.metadata_file):
|
if os.path.exists(self.metadata_file):
|
||||||
with open(self.metadata_file, "r") as f:
|
with open(self.metadata_file, "r") as f:
|
||||||
self.collections = json.load(f)
|
self.collections = json.load(f)
|
||||||
else:
|
else:
|
||||||
self.collections = {}
|
self.collections = {}
|
||||||
if(collections := next((c for c in self.collections if c.get("name") == "Uncategorized"), None)) is None:
|
if(collections := next((c for c in self.collections if c.get("name") == "Uncategorized"), None)) is None:
|
||||||
self.collections.append({"name": "Uncategorized", "id": 0, "clips": []})
|
self.collections.append({"name": "Uncategorized", "id": 0, "clips": []})
|
||||||
self.save_metadata()
|
self.save_metadata()
|
||||||
|
|
||||||
def create_collection(self, name):
|
def create_collection(self, name):
|
||||||
if any(c.get("name") == name for c in self.collections):
|
if any(c.get("name") == name for c in self.collections):
|
||||||
raise ValueError(f"Collection '{name}' already exists.")
|
raise ValueError(f"Collection '{name}' already exists.")
|
||||||
new_id = max((c.get("id", 0) for c in self.collections), default=0) + 1
|
new_id = max((c.get("id", 0) for c in self.collections), default=0) + 1
|
||||||
self.collections.append({"name": name, "id": new_id, "clips": []})
|
self.collections.append({"name": name, "id": new_id, "clips": []})
|
||||||
self.save_metadata()
|
self.save_metadata()
|
||||||
|
|
||||||
def delete_collection(self, name):
|
def delete_collection(self, name):
|
||||||
collection = next((c for c in self.collections if c.get("name") == name), None)
|
collection = next((c for c in self.collections if c.get("name") == name), None)
|
||||||
if collection is None:
|
if collection is None:
|
||||||
raise ValueError(f"Collection '{name}' does not exist.")
|
raise ValueError(f"Collection '{name}' does not exist.")
|
||||||
self.collections.remove(collection)
|
self.collections.remove(collection)
|
||||||
self.save_metadata()
|
self.save_metadata()
|
||||||
|
|
||||||
def add_clip_to_collection(self, collection_name, clip_metadata):
|
def add_clip_to_collection(self, collection_name, clip_metadata):
|
||||||
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
||||||
if collection is None:
|
if collection is None:
|
||||||
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
||||||
collection["clips"].append(clip_metadata)
|
collection["clips"].append(clip_metadata)
|
||||||
self.save_metadata()
|
if not self.socket is None:
|
||||||
|
self.socket.emit('collection_updated', collection)
|
||||||
def remove_clip_from_collection(self, collection_name, clip_metadata):
|
self.save_metadata()
|
||||||
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
|
||||||
if collection is None:
|
def remove_clip_from_collection(self, collection_name, clip_metadata):
|
||||||
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
||||||
# Remove all clips with the same file name as clip_metadata["file_name"]
|
if collection is None:
|
||||||
in_list = any(clip.get("filename") == clip_metadata.get("filename") for clip in collection["clips"])
|
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
||||||
if not in_list:
|
# Remove all clips with the same file name as clip_metadata["file_name"]
|
||||||
raise ValueError(f"Clip with filename '{clip_metadata.get('filename')}' not found in collection '{collection_name}'.")
|
in_list = any(clip.get("filename") == clip_metadata.get("filename") for clip in collection["clips"])
|
||||||
|
if not in_list:
|
||||||
collection["clips"] = [
|
raise ValueError(f"Clip with filename '{clip_metadata.get('filename')}' not found in collection '{collection_name}'.")
|
||||||
clip for clip in collection["clips"]
|
|
||||||
if clip.get("filename") != clip_metadata.get("filename")
|
collection["clips"] = [
|
||||||
]
|
clip for clip in collection["clips"]
|
||||||
self.save_metadata()
|
if clip.get("filename") != clip_metadata.get("filename")
|
||||||
|
]
|
||||||
def move_clip_to_collection(self, source_collection, target_collection, clip_metadata):
|
if not self.socket is None:
|
||||||
self.remove_clip_from_collection(source_collection, clip_metadata)
|
self.socket.emit('collection_updated', collection)
|
||||||
self.add_clip_to_collection(target_collection, clip_metadata)
|
self.save_metadata()
|
||||||
|
|
||||||
def edit_clip_in_collection(self, collection_name, new_clip_metadata):
|
|
||||||
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
def move_clip_to_collection(self, source_collection, target_collection, clip_metadata):
|
||||||
if collection is None:
|
self.remove_clip_from_collection(source_collection, clip_metadata)
|
||||||
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
self.add_clip_to_collection(target_collection, clip_metadata)
|
||||||
# Find the index of the clip with the same file name as old_clip_metadata["file_name"]
|
if not self.socket is None:
|
||||||
index = next((i for i, clip in enumerate(collection["clips"]) if clip.get("filename") == new_clip_metadata.get("filename")), None)
|
self.socket.emit('collection_updated', source_collection)
|
||||||
if index is None:
|
self.socket.emit('collection_updated', target_collection)
|
||||||
raise ValueError(f"Clip with filename '{new_clip_metadata.get('filename')}' not found in collection '{collection_name}'.")
|
|
||||||
|
|
||||||
collection["clips"][index] = new_clip_metadata
|
def edit_clip_in_collection(self, collection_name, new_clip_metadata):
|
||||||
self.save_metadata()
|
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
||||||
|
if collection is None:
|
||||||
def get_collections(self):
|
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
||||||
return list(map(lambda c: {"name": c.get("name"), "id": c.get("id")}, self.collections))
|
# Find the index of the clip with the same file name as old_clip_metadata["file_name"]
|
||||||
|
index = next((i for i, clip in enumerate(collection["clips"]) if clip.get("filename") == new_clip_metadata.get("filename")), None)
|
||||||
def get_clips_in_collection(self, collection_name):
|
if index is None:
|
||||||
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
raise ValueError(f"Clip with filename '{new_clip_metadata.get('filename')}' not found in collection '{collection_name}'.")
|
||||||
if collection is None:
|
|
||||||
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
collection["clips"][index] = new_clip_metadata
|
||||||
return collection["clips"]
|
if not self.socket is None:
|
||||||
|
self.socket.emit('collection_updated', collection)
|
||||||
def reorder_clips_in_collection(self, collection_name, new_order):
|
self.save_metadata()
|
||||||
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
|
||||||
if collection is None:
|
def get_collections(self):
|
||||||
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
return list(map(lambda c: {"name": c.get("name"), "id": c.get("id")}, self.collections))
|
||||||
existing_filenames = {clip.get("filename") for clip in collection["clips"]}
|
|
||||||
new_filenames = {clip.get("filename") for clip in new_order}
|
def get_clips_in_collection(self, collection_name):
|
||||||
|
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
||||||
if not new_filenames.issubset(existing_filenames):
|
if collection is None:
|
||||||
raise ValueError("New order contains clips that do not exist in the collection.")
|
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
||||||
|
return collection["clips"]
|
||||||
collection["clips"] = new_order
|
|
||||||
if not self.socket is None:
|
def reorder_clips_in_collection(self, collection_name, new_order):
|
||||||
self.socket.emit('collection_updated', collection)
|
collection = next((c for c in self.collections if c.get("name") == collection_name), None)
|
||||||
self.save_metadata()
|
if collection is None:
|
||||||
|
raise ValueError(f"Collection '{collection_name}' does not exist.")
|
||||||
def save_metadata(self):
|
existing_filenames = {clip.get("filename") for clip in collection["clips"]}
|
||||||
with open(self.metadata_file, "w") as f:
|
new_filenames = {clip.get("filename") for clip in new_order}
|
||||||
json.dump(self.collections, f, indent=4)
|
|
||||||
|
if not new_filenames.issubset(existing_filenames):
|
||||||
|
raise ValueError("New order contains clips that do not exist in the collection.")
|
||||||
|
|
||||||
|
collection["clips"] = new_order
|
||||||
|
if not self.socket is None:
|
||||||
|
self.socket.emit('collection_updated', collection)
|
||||||
|
self.save_metadata()
|
||||||
|
|
||||||
|
def save_metadata(self):
|
||||||
|
with open(self.metadata_file, "w") as f:
|
||||||
|
json.dump(self.collections, f, indent=4)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
[ViewState]
|
[ViewState]
|
||||||
Mode=
|
Mode=
|
||||||
Vid=
|
Vid=
|
||||||
FolderType=Generic
|
FolderType=Generic
|
||||||
|
|||||||
@ -1,57 +1,57 @@
|
|||||||
|
|
||||||
from flask import Blueprint, request, jsonify
|
from flask import Blueprint, request, jsonify
|
||||||
from audio_io import AudioIO
|
from audio_io import AudioIO
|
||||||
import os
|
import os
|
||||||
|
|
||||||
recording_bp = Blueprint('recording', __name__)
|
recording_bp = Blueprint('recording', __name__)
|
||||||
|
|
||||||
@recording_bp.route('/record/start', methods=['POST'])
|
@recording_bp.route('/record/start', methods=['POST'])
|
||||||
def start_recording():
|
def start_recording():
|
||||||
recorder = AudioIO()
|
recorder = AudioIO()
|
||||||
print('HTTP: Starting audio recording')
|
print('HTTP: Starting audio recording')
|
||||||
recorder.start_recording()
|
recorder.start_recording()
|
||||||
return jsonify({'status': 'recording started'})
|
return jsonify({'status': 'recording started'})
|
||||||
|
|
||||||
@recording_bp.route('/record/stop', methods=['POST'])
|
@recording_bp.route('/record/stop', methods=['POST'])
|
||||||
def stop_recording():
|
def stop_recording():
|
||||||
recorder = AudioIO()
|
recorder = AudioIO()
|
||||||
# print('HTTP: Stopping audio recording')
|
# print('HTTP: Stopping audio recording')
|
||||||
recorder.stop_recording()
|
recorder.stop_recording()
|
||||||
return jsonify({'status': 'recording stopped'})
|
return jsonify({'status': 'recording stopped'})
|
||||||
|
|
||||||
@recording_bp.route('/record/save', methods=['POST'])
|
@recording_bp.route('/record/save', methods=['POST'])
|
||||||
def save_recording():
|
def save_recording():
|
||||||
recorder = AudioIO()
|
recorder = AudioIO()
|
||||||
# print('HTTP: Saving audio recording')
|
# print('HTTP: Saving audio recording')
|
||||||
saved_file = recorder.save_last_n_seconds()
|
saved_file = recorder.save_last_n_seconds()
|
||||||
return jsonify({'status': 'recording saved', 'file': saved_file})
|
return jsonify({'status': 'recording saved', 'file': saved_file})
|
||||||
|
|
||||||
|
|
||||||
@recording_bp.route('/record/status', methods=['GET'])
|
@recording_bp.route('/record/status', methods=['GET'])
|
||||||
def recording_status():
|
def recording_status():
|
||||||
recorder = AudioIO()
|
recorder = AudioIO()
|
||||||
# print('HTTP: Checking recording status')
|
# print('HTTP: Checking recording status')
|
||||||
status = 'recording' if recorder.is_recording() else 'stopped'
|
status = 'recording' if recorder.is_recording() else 'stopped'
|
||||||
return jsonify({'status': status})
|
return jsonify({'status': status})
|
||||||
|
|
||||||
@recording_bp.route('/record/delete', methods=['POST'])
|
@recording_bp.route('/record/delete', methods=['POST'])
|
||||||
def recording_delete():
|
def recording_delete():
|
||||||
filename = request.json.get('filename')
|
filename = request.json.get('filename')
|
||||||
try:
|
try:
|
||||||
os.remove(filename)
|
os.remove(filename)
|
||||||
return jsonify({'status': 'success'})
|
return jsonify({'status': 'success'})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({'status': 'error', 'message': str(e)}), 400
|
return jsonify({'status': 'error', 'message': str(e)}), 400
|
||||||
|
|
||||||
@recording_bp.route('/playback/start', methods=['POST'])
|
@recording_bp.route('/playback/start', methods=['POST'])
|
||||||
def playback_start():
|
def playback_start():
|
||||||
print(f"Playing clip")
|
print(f"Playing clip")
|
||||||
# print('HTTP: Starting audio playback')
|
# print('HTTP: Starting audio playback')
|
||||||
clip = request.json
|
clip = request.json
|
||||||
try:
|
try:
|
||||||
io = AudioIO()
|
io = AudioIO()
|
||||||
io.play_clip(clip)
|
io.play_clip(clip)
|
||||||
# os.remove(filename)
|
# os.remove(filename)
|
||||||
return jsonify({'status': 'success'})
|
return jsonify({'status': 'success'})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({'status': 'error', 'message': str(e)}), 400
|
return jsonify({'status': 'error', 'message': str(e)}), 400
|
||||||
@ -1,32 +1,32 @@
|
|||||||
from flask import Blueprint, request, jsonify
|
from flask import Blueprint, request, jsonify
|
||||||
from settings import SettingsManager
|
from settings import SettingsManager
|
||||||
|
|
||||||
settings_bp = Blueprint('settings', __name__)
|
settings_bp = Blueprint('settings', __name__)
|
||||||
|
|
||||||
|
|
||||||
@settings_bp.route('/settings', methods=['GET'])
|
@settings_bp.route('/settings', methods=['GET'])
|
||||||
def get_all_settings():
|
def get_all_settings():
|
||||||
return jsonify({'status': 'success', 'settings': SettingsManager().get_all_settings()})
|
return jsonify({'status': 'success', 'settings': SettingsManager().get_all_settings()})
|
||||||
|
|
||||||
@settings_bp.route('/settings/<name>', methods=['GET'])
|
@settings_bp.route('/settings/<name>', methods=['GET'])
|
||||||
def get_setting(name):
|
def get_setting(name):
|
||||||
value = SettingsManager().get_settings(name)
|
value = SettingsManager().get_settings(name)
|
||||||
if value is not None:
|
if value is not None:
|
||||||
return jsonify({'status': 'success', 'name': name, 'value': value})
|
return jsonify({'status': 'success', 'name': name, 'value': value})
|
||||||
else:
|
else:
|
||||||
return jsonify({'status': 'error', 'message': f'Setting "{name}" not found'}), 404
|
return jsonify({'status': 'error', 'message': f'Setting "{name}" not found'}), 404
|
||||||
|
|
||||||
@settings_bp.route('/settings/update', methods=['POST'])
|
@settings_bp.route('/settings/update', methods=['POST'])
|
||||||
def set_all_settings():
|
def set_all_settings():
|
||||||
settings = request.json.get('settings')
|
settings = request.json.get('settings')
|
||||||
print (f"Received settings update: {settings}")
|
print (f"Received settings update: {settings}")
|
||||||
if settings is None:
|
if settings is None:
|
||||||
return jsonify({'status': 'error', 'message': 'Settings are required'}), 400
|
return jsonify({'status': 'error', 'message': 'Settings are required'}), 400
|
||||||
try:
|
try:
|
||||||
for name, value in settings.items():
|
for name, value in settings.items():
|
||||||
print(f"Updating setting '{name}' to '{value}'")
|
print(f"Updating setting '{name}' to '{value}'")
|
||||||
SettingsManager().set_settings(name, value)
|
SettingsManager().set_settings(name, value)
|
||||||
return jsonify({'status': 'success', 'settings': settings})
|
return jsonify({'status': 'success', 'settings': settings})
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
return jsonify({'status': 'error', 'message': str(e)}), 400
|
return jsonify({'status': 'error', 'message': str(e)}), 400
|
||||||
|
|
||||||
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"input_device": {
|
"input_device": {
|
||||||
"index": 0,
|
"index": 0,
|
||||||
"name": "Microsoft Sound Mapper - Input",
|
"name": "Microsoft Sound Mapper - Input",
|
||||||
"max_input_channels": 2,
|
"max_input_channels": 2,
|
||||||
"default_samplerate": 44100.0
|
"default_samplerate": 44100.0
|
||||||
},
|
},
|
||||||
"save_path": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\src\\recordings",
|
"save_path": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\src\\recordings",
|
||||||
"recording_length": 15
|
"recording_length": 15
|
||||||
}
|
}
|
||||||
@ -1,112 +1,108 @@
|
|||||||
import sounddevice as sd
|
import sounddevice as sd
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import comtypes
|
import json
|
||||||
import comtypes.client
|
|
||||||
from comtypes import CLSCTX_ALL
|
class WindowsAudioManager:
|
||||||
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
|
_instance = None
|
||||||
import json
|
|
||||||
|
def __new__(cls, *args, **kwargs):
|
||||||
class WindowsAudioManager:
|
if cls._instance is None:
|
||||||
_instance = None
|
cls._instance = super().__new__(cls)
|
||||||
|
cls._instance.init()
|
||||||
def __new__(cls, *args, **kwargs):
|
return cls._instance
|
||||||
if cls._instance is None:
|
def init(self):
|
||||||
cls._instance = super().__new__(cls)
|
"""
|
||||||
cls._instance.init()
|
Initialize Windows audio device and volume management.
|
||||||
return cls._instance
|
"""
|
||||||
def init(self):
|
host_apis = sd.query_hostapis()
|
||||||
"""
|
wasapi_device_indexes = None
|
||||||
Initialize Windows audio device and volume management.
|
for api in host_apis:
|
||||||
"""
|
if api['name'].lower() == 'Windows WASAPI'.lower():
|
||||||
host_apis = sd.query_hostapis()
|
wasapi_device_indexes = api['devices']
|
||||||
wasapi_device_indexes = None
|
break
|
||||||
for api in host_apis:
|
# print(f"Host APIs: {host_apis}")
|
||||||
if api['name'].lower() == 'Windows WASAPI'.lower():
|
# print(f"WASAPI Device Indexes: {wasapi_device_indexes}")
|
||||||
wasapi_device_indexes = api['devices']
|
wasapi_device_indexes = set(wasapi_device_indexes) if wasapi_device_indexes is not None else set()
|
||||||
break
|
self.devices = [dev for dev in sd.query_devices() if dev['index'] in wasapi_device_indexes]
|
||||||
# print(f"Host APIs: {host_apis}")
|
# self.devices = sd.query_devices()
|
||||||
# print(f"WASAPI Device Indexes: {wasapi_device_indexes}")
|
# print(f"devices: {self.devices}")
|
||||||
wasapi_device_indexes = set(wasapi_device_indexes) if wasapi_device_indexes is not None else set()
|
|
||||||
self.devices = [dev for dev in sd.query_devices() if dev['index'] in wasapi_device_indexes]
|
self.default_input = sd.default.device[0]
|
||||||
# self.devices = sd.query_devices()
|
self.default_output = sd.default.device[1]
|
||||||
# print(f"devices: {self.devices}")
|
|
||||||
|
def list_audio_devices(self, kind='input'):
|
||||||
self.default_input = sd.default.device[0]
|
"""
|
||||||
self.default_output = sd.default.device[1]
|
List available audio devices.
|
||||||
|
|
||||||
def list_audio_devices(self, kind='input'):
|
:param kind: 'input' or 'output'
|
||||||
"""
|
:return: List of audio devices
|
||||||
List available audio devices.
|
"""
|
||||||
|
if kind == 'input':
|
||||||
:param kind: 'input' or 'output'
|
return [
|
||||||
:return: List of audio devices
|
{
|
||||||
"""
|
'index': dev['index'],
|
||||||
if kind == 'input':
|
'name': dev['name'],
|
||||||
return [
|
'channels': dev['max_input_channels'],
|
||||||
{
|
'default_samplerate': dev['default_samplerate']
|
||||||
'index': dev['index'],
|
}
|
||||||
'name': dev['name'],
|
for dev in self.devices if dev['max_input_channels'] > 0
|
||||||
'channels': dev['max_input_channels'],
|
]
|
||||||
'default_samplerate': dev['default_samplerate']
|
elif kind == 'output':
|
||||||
}
|
return [
|
||||||
for dev in self.devices if dev['max_input_channels'] > 0
|
{
|
||||||
]
|
'index': dev['index'],
|
||||||
elif kind == 'output':
|
'name': dev['name'],
|
||||||
return [
|
'channels': dev['max_output_channels'],
|
||||||
{
|
'default_samplerate': dev['default_samplerate']
|
||||||
'index': dev['index'],
|
}
|
||||||
'name': dev['name'],
|
for dev in self.devices if dev['max_output_channels'] > 0
|
||||||
'channels': dev['max_output_channels'],
|
]
|
||||||
'default_samplerate': dev['default_samplerate']
|
def get_default_device(self, kind='input'):
|
||||||
}
|
"""
|
||||||
for dev in self.devices if dev['max_output_channels'] > 0
|
Get the default audio device.
|
||||||
]
|
|
||||||
def get_default_device(self, kind='input'):
|
:param kind: 'input' or 'output'
|
||||||
"""
|
:return: Default audio device information
|
||||||
Get the default audio device.
|
"""
|
||||||
|
if kind == 'input':
|
||||||
:param kind: 'input' or 'output'
|
dev = self.devices[self.default_input]
|
||||||
:return: Default audio device information
|
return [
|
||||||
"""
|
{
|
||||||
if kind == 'input':
|
'index': dev['index'],
|
||||||
dev = self.devices[self.default_input]
|
'name': dev['name'],
|
||||||
return [
|
'max_input_channels': dev['max_input_channels'],
|
||||||
{
|
'default_samplerate': dev['default_samplerate']
|
||||||
'index': dev['index'],
|
}
|
||||||
'name': dev['name'],
|
]
|
||||||
'max_input_channels': dev['max_input_channels'],
|
|
||||||
'default_samplerate': dev['default_samplerate']
|
def set_default_input_device(self, device_index):
|
||||||
}
|
if(device_index is None):
|
||||||
]
|
return 0
|
||||||
|
"""
|
||||||
def set_default_input_device(self, device_index):
|
Set the default input audio device.
|
||||||
if(device_index is None):
|
|
||||||
return 0
|
:param device_index: Index of the audio device
|
||||||
"""
|
:return: Sample rate of the selected device
|
||||||
Set the default input audio device.
|
"""
|
||||||
|
sd.default.device[0] = device_index
|
||||||
:param device_index: Index of the audio device
|
self.default_input = device_index
|
||||||
:return: Sample rate of the selected device
|
|
||||||
"""
|
# Get the sample rate of the selected device
|
||||||
sd.default.device[0] = device_index
|
device_info = sd.query_devices(device_index)
|
||||||
self.default_input = device_index
|
return device_info['default_samplerate']
|
||||||
|
|
||||||
# Get the sample rate of the selected device
|
def set_default_output_device(self, device_index):
|
||||||
device_info = sd.query_devices(device_index)
|
if(device_index is None):
|
||||||
return device_info['default_samplerate']
|
return self.get_current_output_device_sample_rate()
|
||||||
|
"""
|
||||||
def set_default_output_device(self, device_index):
|
Set the default output audio device.
|
||||||
if(device_index is None):
|
|
||||||
return self.get_current_output_device_sample_rate()
|
:param device_index: Index of the audio device
|
||||||
"""
|
:return: Sample rate of the selected device
|
||||||
Set the default output audio device.
|
"""
|
||||||
|
sd.default.device[1] = device_index
|
||||||
:param device_index: Index of the audio device
|
self.default_output = device_index
|
||||||
:return: Sample rate of the selected device
|
|
||||||
"""
|
# Get the sample rate of the selected device
|
||||||
sd.default.device[1] = device_index
|
device_info = sd.query_devices(device_index)
|
||||||
self.default_output = device_index
|
|
||||||
|
|
||||||
# Get the sample rate of the selected device
|
|
||||||
device_info = sd.query_devices(device_index)
|
|
||||||
return device_info['default_samplerate']
|
return device_info['default_samplerate']
|
||||||
@ -18,6 +18,8 @@ import { resolveHtmlPath } from './util';
|
|||||||
import registerFileIpcHandlers from '../ipc/audio/main';
|
import registerFileIpcHandlers from '../ipc/audio/main';
|
||||||
import PythonSubprocessManager from './service';
|
import PythonSubprocessManager from './service';
|
||||||
|
|
||||||
|
const pythonManager = new PythonSubprocessManager('src/main.py');
|
||||||
|
|
||||||
class AppUpdater {
|
class AppUpdater {
|
||||||
constructor() {
|
constructor() {
|
||||||
log.transports.file.level = 'info';
|
log.transports.file.level = 'info';
|
||||||
@ -112,9 +114,6 @@ const createWindow = async () => {
|
|||||||
|
|
||||||
registerFileIpcHandlers();
|
registerFileIpcHandlers();
|
||||||
|
|
||||||
const pythonManager = new PythonSubprocessManager('src/main.py');
|
|
||||||
|
|
||||||
pythonManager.start();
|
|
||||||
// Remove this if your app does not use auto updates
|
// Remove this if your app does not use auto updates
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
new AppUpdater();
|
new AppUpdater();
|
||||||
@ -127,6 +126,7 @@ const createWindow = async () => {
|
|||||||
app.on('window-all-closed', () => {
|
app.on('window-all-closed', () => {
|
||||||
// Respect the OSX convention of having the application in memory even
|
// Respect the OSX convention of having the application in memory even
|
||||||
// after all windows have been closed
|
// after all windows have been closed
|
||||||
|
pythonManager.stop();
|
||||||
if (process.platform !== 'darwin') {
|
if (process.platform !== 'darwin') {
|
||||||
app.quit();
|
app.quit();
|
||||||
}
|
}
|
||||||
@ -135,6 +135,7 @@ app.on('window-all-closed', () => {
|
|||||||
app
|
app
|
||||||
.whenReady()
|
.whenReady()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
// pythonManager.start();
|
||||||
createWindow();
|
createWindow();
|
||||||
app.on('activate', () => {
|
app.on('activate', () => {
|
||||||
// On macOS it's common to re-create a window in the app when the
|
// On macOS it's common to re-create a window in the app when the
|
||||||
|
|||||||
@ -40,10 +40,10 @@ export default class PythonSubprocessManager {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
this.process.stdout.on('data', (data: Buffer) => {
|
this.process.stdout.on('data', (data: Buffer) => {
|
||||||
console.log(`Python stdout: ${data.toString()}`);
|
// console.log(`Python stdout: ${data.toString()}`);
|
||||||
});
|
});
|
||||||
this.process.stderr.on('data', (data: Buffer) => {
|
this.process.stderr.on('data', (data: Buffer) => {
|
||||||
// console.error(`Python stderr: ${data.toString()}`);
|
// console.error(`Python stderr: ${data.toString()}`);
|
||||||
const lines = data.toString().split('\n');
|
const lines = data.toString().split('\n');
|
||||||
// eslint-disable-next-line no-restricted-syntax
|
// eslint-disable-next-line no-restricted-syntax
|
||||||
for (const line of lines) {
|
for (const line of lines) {
|
||||||
|
|||||||
@ -67,32 +67,11 @@ const metadataSlice = createSlice({
|
|||||||
targetState.clips.push(clip);
|
targetState.clips.push(clip);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
addNewClips(state, action) {
|
addNewClip(state, action) {
|
||||||
const { collections } = action.payload;
|
const { clip } = action.payload;
|
||||||
Object.keys(collections).forEach((collection) => {
|
state.collections.forEach((collection) => {
|
||||||
const collectionState = state.collections.find(
|
if (collection.name === 'Uncategorized') {
|
||||||
(col) => col.name === collection,
|
collection.clips.push(clip);
|
||||||
);
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -113,6 +92,6 @@ export type RootState = ReturnType<AppStore['getState']>;
|
|||||||
// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
|
// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
|
||||||
export type AppDispatch = AppStore['dispatch'];
|
export type AppDispatch = AppStore['dispatch'];
|
||||||
|
|
||||||
export const { setCollections, addNewClips, addCollection } =
|
export const { setCollections, addNewClip, addCollection } =
|
||||||
metadataSlice.actions;
|
metadataSlice.actions;
|
||||||
export default metadataSlice.reducer;
|
export default metadataSlice.reducer;
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import { ThemeProvider, createTheme } from '@mui/material/styles';
|
|||||||
import DialogTitle from '@mui/material/DialogTitle';
|
import DialogTitle from '@mui/material/DialogTitle';
|
||||||
import DialogContent from '@mui/material/DialogContent';
|
import DialogContent from '@mui/material/DialogContent';
|
||||||
import DialogActions from '@mui/material/DialogActions';
|
import DialogActions from '@mui/material/DialogActions';
|
||||||
|
import io from 'socket.io-client';
|
||||||
// import 'tailwindcss/tailwind.css';
|
// import 'tailwindcss/tailwind.css';
|
||||||
import './App.css';
|
import './App.css';
|
||||||
import ClipList from './components/ClipList';
|
import ClipList from './components/ClipList';
|
||||||
@ -14,7 +15,7 @@ import { useAppDispatch, useAppSelector } from './hooks';
|
|||||||
import { store } from '../redux/main';
|
import { store } from '../redux/main';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import SettingsPage from './Settings';
|
import SettingsPage from './Settings';
|
||||||
import apiFetch from './api';
|
import { apiFetch, getBaseUrl } from './api';
|
||||||
|
|
||||||
function MainPage() {
|
function MainPage() {
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
@ -27,20 +28,46 @@ function MainPage() {
|
|||||||
const [newCollectionOpen, setNewCollectionOpen] = useState(false);
|
const [newCollectionOpen, setNewCollectionOpen] = useState(false);
|
||||||
const [newCollectionName, setNewCollectionName] = useState<string>('');
|
const [newCollectionName, setNewCollectionName] = useState<string>('');
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
const [socket, setSocket] = useState<any>(null);
|
||||||
|
|
||||||
|
useEffect(() => {}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchMetadata = async () => {
|
const initializeSocket = async () => {
|
||||||
try {
|
const baseUrl = await getBaseUrl();
|
||||||
const response = await apiFetch('meta');
|
const newSocket = io(baseUrl);
|
||||||
const data = await response.json();
|
setSocket(newSocket);
|
||||||
dispatch({ type: 'metadata/setAllData', payload: data });
|
newSocket.on('connect', () => {
|
||||||
} catch (error) {
|
console.log('Connected to WebSocket server');
|
||||||
console.error('Error fetching metadata:', error);
|
});
|
||||||
}
|
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();
|
initializeSocket();
|
||||||
const intervalId = setInterval(fetchMetadata, 5000);
|
// const fetchMetadata = async () => {
|
||||||
return () => clearInterval(intervalId);
|
// 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]);
|
}, [dispatch]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import './App.css';
|
|||||||
import TextField from '@mui/material/TextField';
|
import TextField from '@mui/material/TextField';
|
||||||
import Select from '@mui/material/Select';
|
import Select from '@mui/material/Select';
|
||||||
import MenuItem from '@mui/material/MenuItem';
|
import MenuItem from '@mui/material/MenuItem';
|
||||||
import apiFetch from './api';
|
import { apiFetch } from './api';
|
||||||
|
|
||||||
type AudioDevice = {
|
type AudioDevice = {
|
||||||
index: number;
|
index: number;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
const getBaseUrl = async () => {
|
export const getBaseUrl = async () => {
|
||||||
const port = await window.audio.getPort();
|
const port = await window.audio.getPort();
|
||||||
if (port.error || !port.port) {
|
if (port.error || !port.port) {
|
||||||
return `http://localhost:5010`;
|
return `http://localhost:5010`;
|
||||||
@ -7,7 +7,7 @@ const getBaseUrl = async () => {
|
|||||||
return `http://localhost:${port.port}`;
|
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}`;
|
const url = `${await getBaseUrl()}/${endpoint}`;
|
||||||
return fetch(url, options);
|
return fetch(url, options);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
|
|||||||
import AudioTrimmer from './AudioTrimer';
|
import AudioTrimmer from './AudioTrimer';
|
||||||
import { ClipMetadata } from '../../redux/types';
|
import { ClipMetadata } from '../../redux/types';
|
||||||
import { useAppDispatch, useAppSelector } from '../hooks';
|
import { useAppDispatch, useAppSelector } from '../hooks';
|
||||||
import apiFetch from '../api';
|
import { apiFetch } from '../api';
|
||||||
|
|
||||||
export interface ClipListProps {
|
export interface ClipListProps {
|
||||||
collection: string;
|
collection: string;
|
||||||
|
|||||||
@ -1,44 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using SocketIOClient;
|
|
||||||
|
|
||||||
namespace ClientTest
|
|
||||||
{
|
|
||||||
public class Client
|
|
||||||
{
|
|
||||||
private SocketIO client;
|
|
||||||
public Client()
|
|
||||||
{
|
|
||||||
client = new SocketIO(new Uri("http://localhost:5010/"));
|
|
||||||
client.Options.AutoUpgrade = false;
|
|
||||||
client.Options.ConnectionTimeout = TimeSpan.FromSeconds(10);
|
|
||||||
client.Options.Reconnection = false;
|
|
||||||
client.On("test_event", ctx =>
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Received test event: {ctx.RawText}");
|
|
||||||
return Task.CompletedTask;
|
|
||||||
});
|
|
||||||
|
|
||||||
client.On("collection_updated", ctx =>
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Received test event: {ctx.RawText}");
|
|
||||||
return Task.CompletedTask;
|
|
||||||
});
|
|
||||||
client.OnAny((string eventName, IEventContext ctx) =>
|
|
||||||
{
|
|
||||||
Console.WriteLine($"got event: {eventName} \n {ctx.RawText}");
|
|
||||||
return Task.CompletedTask;
|
|
||||||
});
|
|
||||||
|
|
||||||
client.ConnectAsync().Wait();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
client.EmitAsync("test_event", [""]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="SocketIOClient" Version="4.0.0.2" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
// See https://aka.ms/new-console-template for more information
|
|
||||||
using ClientTest;
|
|
||||||
|
|
||||||
Console.WriteLine("Hello, World!");
|
|
||||||
Client client = new Client();
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
await Task.Delay(1000);
|
|
||||||
}
|
|
||||||
@ -1,296 +0,0 @@
|
|||||||
{
|
|
||||||
"runtimeTarget": {
|
|
||||||
"name": ".NETCoreApp,Version=v8.0",
|
|
||||||
"signature": ""
|
|
||||||
},
|
|
||||||
"compilationOptions": {},
|
|
||||||
"targets": {
|
|
||||||
".NETCoreApp,Version=v8.0": {
|
|
||||||
"ClientTest/1.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"SocketIOClient": "4.0.0.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"ClientTest.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection/10.0.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/10.0.2": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging/10.0.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection": "10.0.2",
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "10.0.2",
|
|
||||||
"Microsoft.Extensions.Options": "10.0.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions/10.0.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2",
|
|
||||||
"System.Diagnostics.DiagnosticSource": "10.0.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Options/10.0.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2",
|
|
||||||
"Microsoft.Extensions.Primitives": "10.0.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Options.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Primitives/10.0.2": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Primitives.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Newtonsoft.Json/13.0.4": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Newtonsoft.Json.dll": {
|
|
||||||
"assemblyVersion": "13.0.0.0",
|
|
||||||
"fileVersion": "13.0.4.30916"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"SocketIOClient/4.0.0.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection": "10.0.2",
|
|
||||||
"Microsoft.Extensions.Logging": "10.0.2",
|
|
||||||
"SocketIOClient.Common": "4.0.0",
|
|
||||||
"SocketIOClient.Serializer": "4.0.0.1",
|
|
||||||
"SocketIOClient.Serializer.NewtonsoftJson": "4.0.0.1",
|
|
||||||
"System.Text.Json": "10.0.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/SocketIOClient.dll": {
|
|
||||||
"assemblyVersion": "4.0.0.2",
|
|
||||||
"fileVersion": "4.0.0.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"SocketIOClient.Common/4.0.0": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/SocketIOClient.Common.dll": {
|
|
||||||
"assemblyVersion": "4.0.0.0",
|
|
||||||
"fileVersion": "4.0.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"SocketIOClient.Serializer/4.0.0.1": {
|
|
||||||
"dependencies": {
|
|
||||||
"SocketIOClient.Common": "4.0.0"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/SocketIOClient.Serializer.dll": {
|
|
||||||
"assemblyVersion": "4.0.0.1",
|
|
||||||
"fileVersion": "4.0.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"SocketIOClient.Serializer.NewtonsoftJson/4.0.0.1": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2",
|
|
||||||
"Newtonsoft.Json": "13.0.4",
|
|
||||||
"SocketIOClient.Common": "4.0.0",
|
|
||||||
"SocketIOClient.Serializer": "4.0.0.1"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/SocketIOClient.Serializer.NewtonsoftJson.dll": {
|
|
||||||
"assemblyVersion": "4.0.0.1",
|
|
||||||
"fileVersion": "4.0.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Diagnostics.DiagnosticSource/10.0.2": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/System.Diagnostics.DiagnosticSource.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.IO.Pipelines/10.0.2": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/System.IO.Pipelines.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Text.Encodings.Web/10.0.2": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/System.Text.Encodings.Web.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeTargets": {
|
|
||||||
"runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll": {
|
|
||||||
"rid": "browser",
|
|
||||||
"assetType": "runtime",
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Text.Json/10.0.2": {
|
|
||||||
"dependencies": {
|
|
||||||
"System.IO.Pipelines": "10.0.2",
|
|
||||||
"System.Text.Encodings.Web": "10.0.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/System.Text.Json.dll": {
|
|
||||||
"assemblyVersion": "10.0.0.0",
|
|
||||||
"fileVersion": "10.0.225.61305"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraries": {
|
|
||||||
"ClientTest/1.0.0": {
|
|
||||||
"type": "project",
|
|
||||||
"serviceable": false,
|
|
||||||
"sha512": ""
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-J/Zmp6fY93JbaiZ11ckWvcyxMPjD6XVwIHQXBjryTBgn7O6O20HYg9uVLFcZlNfgH78MnreE/7EH+hjfzn7VyA==",
|
|
||||||
"path": "microsoft.extensions.dependencyinjection/10.0.2",
|
|
||||||
"hashPath": "microsoft.extensions.dependencyinjection.10.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-zOIurr59+kUf9vNcsUkCvKWZv+fPosUZXURZesYkJCvl0EzTc9F7maAO4Cd2WEV7ZJJ0AZrFQvuH6Npph9wdBw==",
|
|
||||||
"path": "microsoft.extensions.dependencyinjection.abstractions/10.0.2",
|
|
||||||
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.10.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-a0EWuBs6D3d7XMGroDXm+WsAi5CVVfjOJvyxurzWnuhBN9CO+1qHKcrKV1JK7H/T4ZtHIoVCOX/YyWM8K87qtw==",
|
|
||||||
"path": "microsoft.extensions.logging/10.0.2",
|
|
||||||
"hashPath": "microsoft.extensions.logging.10.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-RZkez/JjpnO+MZ6efKkSynN6ZztLpw3WbxNzjLCPBd97wWj1S9ZYPWi0nmT4kWBRa6atHsdM1ydGkUr8GudyDQ==",
|
|
||||||
"path": "microsoft.extensions.logging.abstractions/10.0.2",
|
|
||||||
"hashPath": "microsoft.extensions.logging.abstractions.10.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Options/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-1De2LJjmxdqopI5AYC5dIhoZQ79AR5ayywxNF1rXrXFtKQfbQOV9+n/IsZBa7qWlr0MqoGpW8+OY2v/57udZOA==",
|
|
||||||
"path": "microsoft.extensions.options/10.0.2",
|
|
||||||
"hashPath": "microsoft.extensions.options.10.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Primitives/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-QmSiO+oLBEooGgB3i0GRXyeYRDHjllqt3k365jwfZlYWhvSHA3UL2NEVV5m8aZa041eIlblo6KMI5txvTMpTwA==",
|
|
||||||
"path": "microsoft.extensions.primitives/10.0.2",
|
|
||||||
"hashPath": "microsoft.extensions.primitives.10.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Newtonsoft.Json/13.0.4": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==",
|
|
||||||
"path": "newtonsoft.json/13.0.4",
|
|
||||||
"hashPath": "newtonsoft.json.13.0.4.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"SocketIOClient/4.0.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-RYtHafPCBCoY8F9KI583t4Dw3+c45XHmPf6xLIHtQeSimDLn3rMUSnITcCCRzbI7ITkKgw1eBhICdeVEs4hjHQ==",
|
|
||||||
"path": "socketioclient/4.0.0.2",
|
|
||||||
"hashPath": "socketioclient.4.0.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"SocketIOClient.Common/4.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-7wlg0hMX5/k+fZejclVR7aKSj+Q37KCmVrKPIjZV+9z/odb11hZ4L+a0T3cV1w1jicTBWFEKvjWfWh6YKtz9Qg==",
|
|
||||||
"path": "socketioclient.common/4.0.0",
|
|
||||||
"hashPath": "socketioclient.common.4.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"SocketIOClient.Serializer/4.0.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-+p1xnwSkX8UQQLgqr2Em6dIATl5pR7awHj1nbaRd/9aA2iAHGgy7HsseN8eblv3NHlPtTP9Y3IFDl5JKfWSYjg==",
|
|
||||||
"path": "socketioclient.serializer/4.0.0.1",
|
|
||||||
"hashPath": "socketioclient.serializer.4.0.0.1.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"SocketIOClient.Serializer.NewtonsoftJson/4.0.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-D7nzYdIcNIPjGp7LW+KmJHk5I6uz3ioGb6fwxdpspuruwTTl1bTwczRuvEFcFjTHtb0Avhbcaw65jo6eAUmsYw==",
|
|
||||||
"path": "socketioclient.serializer.newtonsoftjson/4.0.0.1",
|
|
||||||
"hashPath": "socketioclient.serializer.newtonsoftjson.4.0.0.1.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Diagnostics.DiagnosticSource/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-lYWBy8fKkJHaRcOuw30d67PrtVjR5754sz5Wl76s8P+vJ9FSThh9b7LIcTSODx1LY7NB3Srvg+JMnzd67qNZOw==",
|
|
||||||
"path": "system.diagnostics.diagnosticsource/10.0.2",
|
|
||||||
"hashPath": "system.diagnostics.diagnosticsource.10.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.IO.Pipelines/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-EqMsn9r18ABvTDxrDce4OWDhBE3y+rR23ilG7Y3BudDKrDKrLG/hkD/JmeFZbctAPxSkCjyJ/Ddwbn/g7ufRJA==",
|
|
||||||
"path": "system.io.pipelines/10.0.2",
|
|
||||||
"hashPath": "system.io.pipelines.10.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Text.Encodings.Web/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-Ro4cLT4qpRy64crfLAy3ekihtXckeXrD5eI6qb6NDSEVyHcHsmH7KgN4dbnIuiBmXIoaCslx4SynLYxag1SLSQ==",
|
|
||||||
"path": "system.text.encodings.web/10.0.2",
|
|
||||||
"hashPath": "system.text.encodings.web.10.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"System.Text.Json/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-zy8ey7I16G9neZ6uzxrnYwS7pidElzN8XarsBjGu7lE2m7afTKMEe18KbY3ZSmh/z/bR40oxjd6hlUcmOEaMHw==",
|
|
||||||
"path": "system.text.json/10.0.2",
|
|
||||||
"hashPath": "system.text.json.10.0.2.nupkg.sha512"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"runtimeOptions": {
|
|
||||||
"tfm": "net8.0",
|
|
||||||
"framework": {
|
|
||||||
"name": "Microsoft.NETCore.App",
|
|
||||||
"version": "8.0.0"
|
|
||||||
},
|
|
||||||
"configProperties": {
|
|
||||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,82 +0,0 @@
|
|||||||
{
|
|
||||||
"format": 1,
|
|
||||||
"restore": {
|
|
||||||
"C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\stream_deck_plugin\\ClientTest\\ClientTest.csproj": {}
|
|
||||||
},
|
|
||||||
"projects": {
|
|
||||||
"C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\stream_deck_plugin\\ClientTest\\ClientTest.csproj": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"restore": {
|
|
||||||
"projectUniqueName": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\stream_deck_plugin\\ClientTest\\ClientTest.csproj",
|
|
||||||
"projectName": "ClientTest",
|
|
||||||
"projectPath": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\stream_deck_plugin\\ClientTest\\ClientTest.csproj",
|
|
||||||
"packagesPath": "C:\\Users\\mickl\\.nuget\\packages\\",
|
|
||||||
"outputPath": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\stream_deck_plugin\\ClientTest\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"fallbackFolders": [
|
|
||||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
|
||||||
],
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\mickl\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
|
||||||
],
|
|
||||||
"originalTargetFrameworks": [
|
|
||||||
"net8.0"
|
|
||||||
],
|
|
||||||
"sources": {
|
|
||||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
|
||||||
"C:\\Program Files\\dotnet\\library-packs": {},
|
|
||||||
"https://api.nuget.org/v3/index.json": {},
|
|
||||||
"https://www.nuget.org/api/v2": {},
|
|
||||||
"https://www.nuget.org/api/v2": {}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net8.0": {
|
|
||||||
"targetAlias": "net8.0",
|
|
||||||
"projectReferences": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"warningProperties": {
|
|
||||||
"warnAsError": [
|
|
||||||
"NU1605"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"restoreAuditProperties": {
|
|
||||||
"enableAudit": "true",
|
|
||||||
"auditLevel": "low",
|
|
||||||
"auditMode": "direct"
|
|
||||||
},
|
|
||||||
"SdkAnalysisLevel": "9.0.300"
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net8.0": {
|
|
||||||
"targetAlias": "net8.0",
|
|
||||||
"dependencies": {
|
|
||||||
"SocketIOClient": {
|
|
||||||
"target": "Package",
|
|
||||||
"version": "[4.0.0.2, )"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"imports": [
|
|
||||||
"net461",
|
|
||||||
"net462",
|
|
||||||
"net47",
|
|
||||||
"net471",
|
|
||||||
"net472",
|
|
||||||
"net48",
|
|
||||||
"net481"
|
|
||||||
],
|
|
||||||
"assetTargetFallback": true,
|
|
||||||
"warn": true,
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.307/PortableRuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
|
||||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
|
||||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
|
||||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
|
||||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\mickl\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
|
|
||||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
|
||||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.1</NuGetToolVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<SourceRoot Include="C:\Users\mickl\.nuget\packages\" />
|
|
||||||
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<Import Project="$(NuGetPackageRoot)system.text.json\10.0.2\buildTransitive\net8.0\System.Text.Json.targets" Condition="Exists('$(NuGetPackageRoot)system.text.json\10.0.2\buildTransitive\net8.0\System.Text.Json.targets')" />
|
|
||||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.options\10.0.2\buildTransitive\net8.0\Microsoft.Extensions.Options.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.options\10.0.2\buildTransitive\net8.0\Microsoft.Extensions.Options.targets')" />
|
|
||||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\10.0.2\buildTransitive\net8.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\10.0.2\buildTransitive\net8.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.42000
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("ClientTest")]
|
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8fda2a03af52202a841719b00041c255fbbd040b")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("ClientTest")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("ClientTest")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// Generated by the MSBuild WriteCodeFragment class.
|
|
||||||
|
|
||||||
@ -1 +0,0 @@
|
|||||||
b89f91df1271abd7a390167ccc0cd2ebdef3dc366236d6606664bbd406eb38f9
|
|
||||||
@ -1,15 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = net8.0
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules =
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = ClientTest
|
|
||||||
build_property.ProjectDir = C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\
|
|
||||||
build_property.EnableComHosting =
|
|
||||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
||||||
build_property.EffectiveAnalysisLevelStyle = 8.0
|
|
||||||
build_property.EnableCodeStyleSeverity =
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
// <auto-generated/>
|
|
||||||
global using global::System;
|
|
||||||
global using global::System.Collections.Generic;
|
|
||||||
global using global::System.IO;
|
|
||||||
global using global::System.Linq;
|
|
||||||
global using global::System.Net.Http;
|
|
||||||
global using global::System.Threading;
|
|
||||||
global using global::System.Threading.Tasks;
|
|
||||||
@ -1 +0,0 @@
|
|||||||
1f0c38acb4d7bd17394bf7939e4ce787d1f5925df1475233861d85368fa71fee
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\ClientTest.exe
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\ClientTest.deps.json
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\ClientTest.runtimeconfig.json
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\ClientTest.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\ClientTest.pdb
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\Microsoft.Extensions.Logging.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\Microsoft.Extensions.Logging.Abstractions.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\Microsoft.Extensions.Options.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\Microsoft.Extensions.Primitives.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\Newtonsoft.Json.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\SocketIOClient.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\SocketIOClient.Common.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\SocketIOClient.Serializer.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\SocketIOClient.Serializer.NewtonsoftJson.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\System.Diagnostics.DiagnosticSource.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\System.IO.Pipelines.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\System.Text.Encodings.Web.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\System.Text.Json.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\bin\Debug\net8.0\runtimes\browser\lib\net8.0\System.Text.Encodings.Web.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ClientTest.csproj.AssemblyReference.cache
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ClientTest.GeneratedMSBuildEditorConfig.editorconfig
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ClientTest.AssemblyInfoInputs.cache
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ClientTest.AssemblyInfo.cs
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ClientTest.csproj.CoreCompileInputs.cache
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ClientTest.csproj.Up2Date
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ClientTest.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\refint\ClientTest.dll
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ClientTest.pdb
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ClientTest.genruntimeconfig.cache
|
|
||||||
C:\Users\mickl\Desktop\cliptrim-ui\ClipTrimApp\stream_deck_plugin\ClientTest\obj\Debug\net8.0\ref\ClientTest.dll
|
|
||||||
@ -1 +0,0 @@
|
|||||||
40ec4719d56f65f4b43aa0dee95fda9a8b0de79bb640acda719765913ae5eca1
|
|
||||||
@ -1,834 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 3,
|
|
||||||
"targets": {
|
|
||||||
"net8.0": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/_._": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/_._": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection": "10.0.2",
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "10.0.2",
|
|
||||||
"Microsoft.Extensions.Options": "10.0.2"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/_._": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2",
|
|
||||||
"System.Diagnostics.DiagnosticSource": "10.0.2"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Options/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2",
|
|
||||||
"Microsoft.Extensions.Primitives": "10.0.2"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Options.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Options.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Primitives/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Primitives.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Primitives.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/_._": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Newtonsoft.Json/13.0.4": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net6.0/Newtonsoft.Json.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/Newtonsoft.Json.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"SocketIOClient/4.0.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection": "10.0.2",
|
|
||||||
"Microsoft.Extensions.Logging": "10.0.2",
|
|
||||||
"SocketIOClient.Common": "4.0.0",
|
|
||||||
"SocketIOClient.Serializer": "4.0.0.1",
|
|
||||||
"SocketIOClient.Serializer.NewtonsoftJson": "4.0.0.1",
|
|
||||||
"System.Text.Json": "10.0.2"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/SocketIOClient.dll": {}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/SocketIOClient.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"SocketIOClient.Common/4.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/SocketIOClient.Common.dll": {}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/SocketIOClient.Common.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"SocketIOClient.Serializer/4.0.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"SocketIOClient.Common": "4.0.0"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/SocketIOClient.Serializer.dll": {}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/SocketIOClient.Serializer.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"SocketIOClient.Serializer.NewtonsoftJson/4.0.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2",
|
|
||||||
"Newtonsoft.Json": "13.0.4",
|
|
||||||
"SocketIOClient.Common": "4.0.0",
|
|
||||||
"SocketIOClient.Serializer": "4.0.0.1"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/SocketIOClient.Serializer.NewtonsoftJson.dll": {}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/SocketIOClient.Serializer.NewtonsoftJson.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Diagnostics.DiagnosticSource/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/System.Diagnostics.DiagnosticSource.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/System.Diagnostics.DiagnosticSource.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/_._": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.IO.Pipelines/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/System.IO.Pipelines.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/System.IO.Pipelines.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/_._": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Text.Encodings.Web/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/System.Text.Encodings.Web.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/System.Text.Encodings.Web.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/_._": {}
|
|
||||||
},
|
|
||||||
"runtimeTargets": {
|
|
||||||
"runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll": {
|
|
||||||
"assetType": "runtime",
|
|
||||||
"rid": "browser"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"System.Text.Json/10.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"System.IO.Pipelines": "10.0.2",
|
|
||||||
"System.Text.Encodings.Web": "10.0.2"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/System.Text.Json.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/System.Text.Json.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net8.0/System.Text.Json.targets": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraries": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection/10.0.2": {
|
|
||||||
"sha512": "J/Zmp6fY93JbaiZ11ckWvcyxMPjD6XVwIHQXBjryTBgn7O6O20HYg9uVLFcZlNfgH78MnreE/7EH+hjfzn7VyA==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "microsoft.extensions.dependencyinjection/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets",
|
|
||||||
"buildTransitive/net462/_._",
|
|
||||||
"buildTransitive/net8.0/_._",
|
|
||||||
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.DependencyInjection.dll",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.DependencyInjection.xml",
|
|
||||||
"lib/net462/Microsoft.Extensions.DependencyInjection.dll",
|
|
||||||
"lib/net462/Microsoft.Extensions.DependencyInjection.xml",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.dll",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.xml",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.DependencyInjection.dll",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.DependencyInjection.xml",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml",
|
|
||||||
"microsoft.extensions.dependencyinjection.10.0.2.nupkg.sha512",
|
|
||||||
"microsoft.extensions.dependencyinjection.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/10.0.2": {
|
|
||||||
"sha512": "zOIurr59+kUf9vNcsUkCvKWZv+fPosUZXURZesYkJCvl0EzTc9F7maAO4Cd2WEV7ZJJ0AZrFQvuH6Npph9wdBw==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "microsoft.extensions.dependencyinjection.abstractions/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets",
|
|
||||||
"buildTransitive/net462/_._",
|
|
||||||
"buildTransitive/net8.0/_._",
|
|
||||||
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"microsoft.extensions.dependencyinjection.abstractions.10.0.2.nupkg.sha512",
|
|
||||||
"microsoft.extensions.dependencyinjection.abstractions.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging/10.0.2": {
|
|
||||||
"sha512": "a0EWuBs6D3d7XMGroDXm+WsAi5CVVfjOJvyxurzWnuhBN9CO+1qHKcrKV1JK7H/T4ZtHIoVCOX/YyWM8K87qtw==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "microsoft.extensions.logging/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"buildTransitive/net461/Microsoft.Extensions.Logging.targets",
|
|
||||||
"buildTransitive/net462/_._",
|
|
||||||
"buildTransitive/net8.0/_._",
|
|
||||||
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.Logging.dll",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.Logging.xml",
|
|
||||||
"lib/net462/Microsoft.Extensions.Logging.dll",
|
|
||||||
"lib/net462/Microsoft.Extensions.Logging.xml",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.dll",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.xml",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.Logging.dll",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.Logging.xml",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Logging.dll",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Logging.xml",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.Logging.dll",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.Logging.xml",
|
|
||||||
"microsoft.extensions.logging.10.0.2.nupkg.sha512",
|
|
||||||
"microsoft.extensions.logging.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions/10.0.2": {
|
|
||||||
"sha512": "RZkez/JjpnO+MZ6efKkSynN6ZztLpw3WbxNzjLCPBd97wWj1S9ZYPWi0nmT4kWBRa6atHsdM1ydGkUr8GudyDQ==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "microsoft.extensions.logging.abstractions/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"lib/net462/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/net462/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"microsoft.extensions.logging.abstractions.10.0.2.nupkg.sha512",
|
|
||||||
"microsoft.extensions.logging.abstractions.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Options/10.0.2": {
|
|
||||||
"sha512": "1De2LJjmxdqopI5AYC5dIhoZQ79AR5ayywxNF1rXrXFtKQfbQOV9+n/IsZBa7qWlr0MqoGpW8+OY2v/57udZOA==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "microsoft.extensions.options/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Options.SourceGeneration.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll",
|
|
||||||
"buildTransitive/net461/Microsoft.Extensions.Options.targets",
|
|
||||||
"buildTransitive/net462/Microsoft.Extensions.Options.targets",
|
|
||||||
"buildTransitive/net8.0/Microsoft.Extensions.Options.targets",
|
|
||||||
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets",
|
|
||||||
"buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.Options.dll",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.Options.xml",
|
|
||||||
"lib/net462/Microsoft.Extensions.Options.dll",
|
|
||||||
"lib/net462/Microsoft.Extensions.Options.xml",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Options.dll",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Options.xml",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.Options.dll",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.Options.xml",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Options.dll",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Options.xml",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.Options.dll",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.Options.xml",
|
|
||||||
"microsoft.extensions.options.10.0.2.nupkg.sha512",
|
|
||||||
"microsoft.extensions.options.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Primitives/10.0.2": {
|
|
||||||
"sha512": "QmSiO+oLBEooGgB3i0GRXyeYRDHjllqt3k365jwfZlYWhvSHA3UL2NEVV5m8aZa041eIlblo6KMI5txvTMpTwA==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "microsoft.extensions.primitives/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"buildTransitive/net461/Microsoft.Extensions.Primitives.targets",
|
|
||||||
"buildTransitive/net462/_._",
|
|
||||||
"buildTransitive/net8.0/_._",
|
|
||||||
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.Primitives.dll",
|
|
||||||
"lib/net10.0/Microsoft.Extensions.Primitives.xml",
|
|
||||||
"lib/net462/Microsoft.Extensions.Primitives.dll",
|
|
||||||
"lib/net462/Microsoft.Extensions.Primitives.xml",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Primitives.dll",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Primitives.xml",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.Primitives.dll",
|
|
||||||
"lib/net9.0/Microsoft.Extensions.Primitives.xml",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Primitives.xml",
|
|
||||||
"microsoft.extensions.primitives.10.0.2.nupkg.sha512",
|
|
||||||
"microsoft.extensions.primitives.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Newtonsoft.Json/13.0.4": {
|
|
||||||
"sha512": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "newtonsoft.json/13.0.4",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"LICENSE.md",
|
|
||||||
"README.md",
|
|
||||||
"lib/net20/Newtonsoft.Json.dll",
|
|
||||||
"lib/net20/Newtonsoft.Json.xml",
|
|
||||||
"lib/net35/Newtonsoft.Json.dll",
|
|
||||||
"lib/net35/Newtonsoft.Json.xml",
|
|
||||||
"lib/net40/Newtonsoft.Json.dll",
|
|
||||||
"lib/net40/Newtonsoft.Json.xml",
|
|
||||||
"lib/net45/Newtonsoft.Json.dll",
|
|
||||||
"lib/net45/Newtonsoft.Json.xml",
|
|
||||||
"lib/net6.0/Newtonsoft.Json.dll",
|
|
||||||
"lib/net6.0/Newtonsoft.Json.xml",
|
|
||||||
"lib/netstandard1.0/Newtonsoft.Json.dll",
|
|
||||||
"lib/netstandard1.0/Newtonsoft.Json.xml",
|
|
||||||
"lib/netstandard1.3/Newtonsoft.Json.dll",
|
|
||||||
"lib/netstandard1.3/Newtonsoft.Json.xml",
|
|
||||||
"lib/netstandard2.0/Newtonsoft.Json.dll",
|
|
||||||
"lib/netstandard2.0/Newtonsoft.Json.xml",
|
|
||||||
"newtonsoft.json.13.0.4.nupkg.sha512",
|
|
||||||
"newtonsoft.json.nuspec",
|
|
||||||
"packageIcon.png"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"SocketIOClient/4.0.0.2": {
|
|
||||||
"sha512": "RYtHafPCBCoY8F9KI583t4Dw3+c45XHmPf6xLIHtQeSimDLn3rMUSnITcCCRzbI7ITkKgw1eBhICdeVEs4hjHQ==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "socketioclient/4.0.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"README.md",
|
|
||||||
"README.zh.md",
|
|
||||||
"lib/net8.0/SocketIOClient.dll",
|
|
||||||
"lib/netstandard2.0/SocketIOClient.dll",
|
|
||||||
"socketioclient.4.0.0.2.nupkg.sha512",
|
|
||||||
"socketioclient.nuspec"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"SocketIOClient.Common/4.0.0": {
|
|
||||||
"sha512": "7wlg0hMX5/k+fZejclVR7aKSj+Q37KCmVrKPIjZV+9z/odb11hZ4L+a0T3cV1w1jicTBWFEKvjWfWh6YKtz9Qg==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "socketioclient.common/4.0.0",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"lib/net8.0/SocketIOClient.Common.dll",
|
|
||||||
"lib/netstandard2.0/SocketIOClient.Common.dll",
|
|
||||||
"socketioclient.common.4.0.0.nupkg.sha512",
|
|
||||||
"socketioclient.common.nuspec"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"SocketIOClient.Serializer/4.0.0.1": {
|
|
||||||
"sha512": "+p1xnwSkX8UQQLgqr2Em6dIATl5pR7awHj1nbaRd/9aA2iAHGgy7HsseN8eblv3NHlPtTP9Y3IFDl5JKfWSYjg==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "socketioclient.serializer/4.0.0.1",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"lib/net8.0/SocketIOClient.Serializer.dll",
|
|
||||||
"lib/netstandard2.0/SocketIOClient.Serializer.dll",
|
|
||||||
"socketioclient.serializer.4.0.0.1.nupkg.sha512",
|
|
||||||
"socketioclient.serializer.nuspec"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"SocketIOClient.Serializer.NewtonsoftJson/4.0.0.1": {
|
|
||||||
"sha512": "D7nzYdIcNIPjGp7LW+KmJHk5I6uz3ioGb6fwxdpspuruwTTl1bTwczRuvEFcFjTHtb0Avhbcaw65jo6eAUmsYw==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "socketioclient.serializer.newtonsoftjson/4.0.0.1",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"lib/net8.0/SocketIOClient.Serializer.NewtonsoftJson.dll",
|
|
||||||
"lib/netstandard2.0/SocketIOClient.Serializer.NewtonsoftJson.dll",
|
|
||||||
"socketioclient.serializer.newtonsoftjson.4.0.0.1.nupkg.sha512",
|
|
||||||
"socketioclient.serializer.newtonsoftjson.nuspec"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"System.Diagnostics.DiagnosticSource/10.0.2": {
|
|
||||||
"sha512": "lYWBy8fKkJHaRcOuw30d67PrtVjR5754sz5Wl76s8P+vJ9FSThh9b7LIcTSODx1LY7NB3Srvg+JMnzd67qNZOw==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "system.diagnostics.diagnosticsource/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"buildTransitive/net461/System.Diagnostics.DiagnosticSource.targets",
|
|
||||||
"buildTransitive/net462/_._",
|
|
||||||
"buildTransitive/net8.0/_._",
|
|
||||||
"buildTransitive/netcoreapp2.0/System.Diagnostics.DiagnosticSource.targets",
|
|
||||||
"lib/net10.0/System.Diagnostics.DiagnosticSource.dll",
|
|
||||||
"lib/net10.0/System.Diagnostics.DiagnosticSource.xml",
|
|
||||||
"lib/net462/System.Diagnostics.DiagnosticSource.dll",
|
|
||||||
"lib/net462/System.Diagnostics.DiagnosticSource.xml",
|
|
||||||
"lib/net8.0/System.Diagnostics.DiagnosticSource.dll",
|
|
||||||
"lib/net8.0/System.Diagnostics.DiagnosticSource.xml",
|
|
||||||
"lib/net9.0/System.Diagnostics.DiagnosticSource.dll",
|
|
||||||
"lib/net9.0/System.Diagnostics.DiagnosticSource.xml",
|
|
||||||
"lib/netstandard2.0/System.Diagnostics.DiagnosticSource.dll",
|
|
||||||
"lib/netstandard2.0/System.Diagnostics.DiagnosticSource.xml",
|
|
||||||
"system.diagnostics.diagnosticsource.10.0.2.nupkg.sha512",
|
|
||||||
"system.diagnostics.diagnosticsource.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"System.IO.Pipelines/10.0.2": {
|
|
||||||
"sha512": "EqMsn9r18ABvTDxrDce4OWDhBE3y+rR23ilG7Y3BudDKrDKrLG/hkD/JmeFZbctAPxSkCjyJ/Ddwbn/g7ufRJA==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "system.io.pipelines/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"buildTransitive/net461/System.IO.Pipelines.targets",
|
|
||||||
"buildTransitive/net462/_._",
|
|
||||||
"buildTransitive/net8.0/_._",
|
|
||||||
"buildTransitive/netcoreapp2.0/System.IO.Pipelines.targets",
|
|
||||||
"lib/net10.0/System.IO.Pipelines.dll",
|
|
||||||
"lib/net10.0/System.IO.Pipelines.xml",
|
|
||||||
"lib/net462/System.IO.Pipelines.dll",
|
|
||||||
"lib/net462/System.IO.Pipelines.xml",
|
|
||||||
"lib/net8.0/System.IO.Pipelines.dll",
|
|
||||||
"lib/net8.0/System.IO.Pipelines.xml",
|
|
||||||
"lib/net9.0/System.IO.Pipelines.dll",
|
|
||||||
"lib/net9.0/System.IO.Pipelines.xml",
|
|
||||||
"lib/netstandard2.0/System.IO.Pipelines.dll",
|
|
||||||
"lib/netstandard2.0/System.IO.Pipelines.xml",
|
|
||||||
"system.io.pipelines.10.0.2.nupkg.sha512",
|
|
||||||
"system.io.pipelines.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"System.Text.Encodings.Web/10.0.2": {
|
|
||||||
"sha512": "Ro4cLT4qpRy64crfLAy3ekihtXckeXrD5eI6qb6NDSEVyHcHsmH7KgN4dbnIuiBmXIoaCslx4SynLYxag1SLSQ==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "system.text.encodings.web/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"buildTransitive/net461/System.Text.Encodings.Web.targets",
|
|
||||||
"buildTransitive/net462/_._",
|
|
||||||
"buildTransitive/net8.0/_._",
|
|
||||||
"buildTransitive/netcoreapp2.0/System.Text.Encodings.Web.targets",
|
|
||||||
"lib/net10.0/System.Text.Encodings.Web.dll",
|
|
||||||
"lib/net10.0/System.Text.Encodings.Web.xml",
|
|
||||||
"lib/net462/System.Text.Encodings.Web.dll",
|
|
||||||
"lib/net462/System.Text.Encodings.Web.xml",
|
|
||||||
"lib/net8.0/System.Text.Encodings.Web.dll",
|
|
||||||
"lib/net8.0/System.Text.Encodings.Web.xml",
|
|
||||||
"lib/net9.0/System.Text.Encodings.Web.dll",
|
|
||||||
"lib/net9.0/System.Text.Encodings.Web.xml",
|
|
||||||
"lib/netstandard2.0/System.Text.Encodings.Web.dll",
|
|
||||||
"lib/netstandard2.0/System.Text.Encodings.Web.xml",
|
|
||||||
"runtimes/browser/lib/net10.0/System.Text.Encodings.Web.dll",
|
|
||||||
"runtimes/browser/lib/net10.0/System.Text.Encodings.Web.xml",
|
|
||||||
"runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll",
|
|
||||||
"runtimes/browser/lib/net8.0/System.Text.Encodings.Web.xml",
|
|
||||||
"runtimes/wasi/lib/net10.0/System.Text.Encodings.Web.dll",
|
|
||||||
"runtimes/wasi/lib/net10.0/System.Text.Encodings.Web.xml",
|
|
||||||
"runtimes/win/lib/net9.0/System.Text.Encodings.Web.dll",
|
|
||||||
"runtimes/win/lib/net9.0/System.Text.Encodings.Web.xml",
|
|
||||||
"system.text.encodings.web.10.0.2.nupkg.sha512",
|
|
||||||
"system.text.encodings.web.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"System.Text.Json/10.0.2": {
|
|
||||||
"sha512": "zy8ey7I16G9neZ6uzxrnYwS7pidElzN8XarsBjGu7lE2m7afTKMEe18KbY3ZSmh/z/bR40oxjd6hlUcmOEaMHw==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "system.text.json/10.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/System.Text.Json.SourceGeneration.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/cs/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/de/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/es/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/fr/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/it/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/ja/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/ko/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/pl/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/ru/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/tr/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/System.Text.Json.SourceGeneration.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/cs/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/de/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/es/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/fr/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/it/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/ja/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/ko/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/pl/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/ru/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/tr/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/System.Text.Json.SourceGeneration.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/cs/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/de/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/es/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/fr/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/it/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ja/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ko/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/pl/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ru/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/tr/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll",
|
|
||||||
"buildTransitive/net461/System.Text.Json.targets",
|
|
||||||
"buildTransitive/net462/System.Text.Json.targets",
|
|
||||||
"buildTransitive/net8.0/System.Text.Json.targets",
|
|
||||||
"buildTransitive/netcoreapp2.0/System.Text.Json.targets",
|
|
||||||
"buildTransitive/netstandard2.0/System.Text.Json.targets",
|
|
||||||
"lib/net10.0/System.Text.Json.dll",
|
|
||||||
"lib/net10.0/System.Text.Json.xml",
|
|
||||||
"lib/net462/System.Text.Json.dll",
|
|
||||||
"lib/net462/System.Text.Json.xml",
|
|
||||||
"lib/net8.0/System.Text.Json.dll",
|
|
||||||
"lib/net8.0/System.Text.Json.xml",
|
|
||||||
"lib/net9.0/System.Text.Json.dll",
|
|
||||||
"lib/net9.0/System.Text.Json.xml",
|
|
||||||
"lib/netstandard2.0/System.Text.Json.dll",
|
|
||||||
"lib/netstandard2.0/System.Text.Json.xml",
|
|
||||||
"system.text.json.10.0.2.nupkg.sha512",
|
|
||||||
"system.text.json.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"projectFileDependencyGroups": {
|
|
||||||
"net8.0": [
|
|
||||||
"SocketIOClient >= 4.0.0.2"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"packageFolders": {
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\": {},
|
|
||||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
|
|
||||||
},
|
|
||||||
"project": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"restore": {
|
|
||||||
"projectUniqueName": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\stream_deck_plugin\\ClientTest\\ClientTest.csproj",
|
|
||||||
"projectName": "ClientTest",
|
|
||||||
"projectPath": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\stream_deck_plugin\\ClientTest\\ClientTest.csproj",
|
|
||||||
"packagesPath": "C:\\Users\\mickl\\.nuget\\packages\\",
|
|
||||||
"outputPath": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\stream_deck_plugin\\ClientTest\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"fallbackFolders": [
|
|
||||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
|
||||||
],
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\mickl\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
|
||||||
],
|
|
||||||
"originalTargetFrameworks": [
|
|
||||||
"net8.0"
|
|
||||||
],
|
|
||||||
"sources": {
|
|
||||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
|
||||||
"C:\\Program Files\\dotnet\\library-packs": {},
|
|
||||||
"https://api.nuget.org/v3/index.json": {},
|
|
||||||
"https://www.nuget.org/api/v2": {},
|
|
||||||
"https://www.nuget.org/api/v2": {}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net8.0": {
|
|
||||||
"targetAlias": "net8.0",
|
|
||||||
"projectReferences": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"warningProperties": {
|
|
||||||
"warnAsError": [
|
|
||||||
"NU1605"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"restoreAuditProperties": {
|
|
||||||
"enableAudit": "true",
|
|
||||||
"auditLevel": "low",
|
|
||||||
"auditMode": "direct"
|
|
||||||
},
|
|
||||||
"SdkAnalysisLevel": "9.0.300"
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net8.0": {
|
|
||||||
"targetAlias": "net8.0",
|
|
||||||
"dependencies": {
|
|
||||||
"SocketIOClient": {
|
|
||||||
"target": "Package",
|
|
||||||
"version": "[4.0.0.2, )"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"imports": [
|
|
||||||
"net461",
|
|
||||||
"net462",
|
|
||||||
"net47",
|
|
||||||
"net471",
|
|
||||||
"net472",
|
|
||||||
"net48",
|
|
||||||
"net481"
|
|
||||||
],
|
|
||||||
"assetTargetFallback": true,
|
|
||||||
"warn": true,
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.307/PortableRuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 2,
|
|
||||||
"dgSpecHash": "h0lIwrEt1zA=",
|
|
||||||
"success": true,
|
|
||||||
"projectFilePath": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\stream_deck_plugin\\ClientTest\\ClientTest.csproj",
|
|
||||||
"expectedPackageFiles": [
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\10.0.2\\microsoft.extensions.dependencyinjection.10.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\10.0.2\\microsoft.extensions.dependencyinjection.abstractions.10.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\microsoft.extensions.logging\\10.0.2\\microsoft.extensions.logging.10.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\10.0.2\\microsoft.extensions.logging.abstractions.10.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\microsoft.extensions.options\\10.0.2\\microsoft.extensions.options.10.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\microsoft.extensions.primitives\\10.0.2\\microsoft.extensions.primitives.10.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\newtonsoft.json\\13.0.4\\newtonsoft.json.13.0.4.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\socketioclient\\4.0.0.2\\socketioclient.4.0.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\socketioclient.common\\4.0.0\\socketioclient.common.4.0.0.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\socketioclient.serializer\\4.0.0.1\\socketioclient.serializer.4.0.0.1.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\socketioclient.serializer.newtonsoftjson\\4.0.0.1\\socketioclient.serializer.newtonsoftjson.4.0.0.1.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\system.diagnostics.diagnosticsource\\10.0.2\\system.diagnostics.diagnosticsource.10.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\system.io.pipelines\\10.0.2\\system.io.pipelines.10.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\system.text.encodings.web\\10.0.2\\system.text.encodings.web.10.0.2.nupkg.sha512",
|
|
||||||
"C:\\Users\\mickl\\.nuget\\packages\\system.text.json\\10.0.2\\system.text.json.10.0.2.nupkg.sha512"
|
|
||||||
],
|
|
||||||
"logs": []
|
|
||||||
}
|
|
||||||
@ -1,25 +1,25 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.8.34330.188
|
VisualStudioVersion = 17.8.34330.188
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClipTrimDotNet", "ClipTrimDotNet\ClipTrimDotNet.csproj", "{4635D874-69C0-4010-BE46-77EF92EB1553}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClipTrimDotNet", "ClipTrimDotNet\ClipTrimDotNet.csproj", "{4635D874-69C0-4010-BE46-77EF92EB1553}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
Release|Any CPU = Release|Any CPU
|
Release|Any CPU = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{4635D874-69C0-4010-BE46-77EF92EB1553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{4635D874-69C0-4010-BE46-77EF92EB1553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{4635D874-69C0-4010-BE46-77EF92EB1553}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{4635D874-69C0-4010-BE46-77EF92EB1553}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{4635D874-69C0-4010-BE46-77EF92EB1553}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{4635D874-69C0-4010-BE46-77EF92EB1553}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{4635D874-69C0-4010-BE46-77EF92EB1553}.Release|Any CPU.Build.0 = Release|Any CPU
|
{4635D874-69C0-4010-BE46-77EF92EB1553}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {926C6896-F36A-4F3B-A9DD-CA3AA48AD99F}
|
SolutionGuid = {926C6896-F36A-4F3B-A9DD-CA3AA48AD99F}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
To use:
|
To use:
|
||||||
1. Right click the project and choose "Manage Nuget Packages"
|
1. Right click the project and choose "Manage Nuget Packages"
|
||||||
2. Choose the restore option in the Nuget screen (or just install the latest StreamDeck-Tools from Nuget)
|
2. Choose the restore option in the Nuget screen (or just install the latest StreamDeck-Tools from Nuget)
|
||||||
3. Update the manifest.json file with the correct details about your plugin
|
3. Update the manifest.json file with the correct details about your plugin
|
||||||
4. Modify PluginAction.cs as needed (it holds the logic for your plugin)
|
4. Modify PluginAction.cs as needed (it holds the logic for your plugin)
|
||||||
5. Modify the PropertyInspector\PluginActionPI.html and PropertyInspector\PluginActionPI.js as needed to show field in the Property Inspector
|
5. Modify the PropertyInspector\PluginActionPI.html and PropertyInspector\PluginActionPI.js as needed to show field in the Property Inspector
|
||||||
6. Before releasing, change the Assembly Information (Right click the project -> Properties -> Application -> Assembly Information...)
|
6. Before releasing, change the Assembly Information (Right click the project -> Properties -> Application -> Assembly Information...)
|
||||||
|
|
||||||
For help with StreamDeck-Tools:
|
For help with StreamDeck-Tools:
|
||||||
Discord Server: http://discord.barraider.com
|
Discord Server: http://discord.barraider.com
|
||||||
Resources:
|
Resources:
|
||||||
* StreamDeck-Tools samples and tutorial: https://github.com/BarRaider/streamdeck-tools
|
* StreamDeck-Tools samples and tutorial: https://github.com/BarRaider/streamdeck-tools
|
||||||
* EasyPI library (for working with Property Inspector): https://github.com/BarRaider/streamdeck-easypi
|
* EasyPI library (for working with Property Inspector): https://github.com/BarRaider/streamdeck-easypi
|
||||||
|
|
||||||
|
|||||||
@ -1,42 +1,42 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<startup>
|
<startup>
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
|
||||||
</startup>
|
</startup>
|
||||||
<runtime>
|
<runtime>
|
||||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="CommandLine" publicKeyToken="5a870481e358d379" culture="neutral" />
|
<assemblyIdentity name="CommandLine" publicKeyToken="5a870481e358d379" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-2.6.0.0" newVersion="2.6.0.0" />
|
<bindingRedirect oldVersion="0.0.0.0-2.6.0.0" newVersion="2.6.0.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="System.Drawing.Common" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="System.Drawing.Common" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
|
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="Microsoft.Extensions.Logging" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
<assemblyIdentity name="Microsoft.Extensions.Logging" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.2" newVersion="10.0.0.2" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
|
|
||||||
|
|||||||
@ -1,53 +1,53 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Serialization;
|
using Newtonsoft.Json.Serialization;
|
||||||
using Newtonsoft.Json.Converters;
|
using Newtonsoft.Json.Converters;
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace ClipTrimDotNet.Client
|
namespace ClipTrimDotNet.Client
|
||||||
{
|
{
|
||||||
public enum PlaybackType
|
public enum PlaybackType
|
||||||
{
|
{
|
||||||
playStop,
|
playStop,
|
||||||
playOverlap
|
playOverlap
|
||||||
}
|
}
|
||||||
public class ClipMetadata
|
public class ClipMetadata
|
||||||
{
|
{
|
||||||
[JsonProperty(PropertyName = "filename")]
|
[JsonProperty(PropertyName = "filename")]
|
||||||
[JsonPropertyName("filename")]
|
[JsonPropertyName("filename")]
|
||||||
|
|
||||||
public string Filename { get; set; }
|
public string Filename { get; set; }
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "name")]
|
[JsonProperty(PropertyName = "name")]
|
||||||
[JsonPropertyName("name")]
|
[JsonPropertyName("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "volume")]
|
[JsonProperty(PropertyName = "volume")]
|
||||||
[JsonPropertyName("volume")]
|
[JsonPropertyName("volume")]
|
||||||
public double Volume { get; set; } = 1.0;
|
public double Volume { get; set; } = 1.0;
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "startTime")]
|
[JsonProperty(PropertyName = "startTime")]
|
||||||
[JsonPropertyName("startTime")]
|
[JsonPropertyName("startTime")]
|
||||||
public double StartTime { get; set; } = 0.0;
|
public double StartTime { get; set; } = 0.0;
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "endTime")]
|
[JsonProperty(PropertyName = "endTime")]
|
||||||
[JsonPropertyName("endTime")]
|
[JsonPropertyName("endTime")]
|
||||||
public double EndTime { get; set; } = 0.0;
|
public double EndTime { get; set; } = 0.0;
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "playbackType")]
|
[JsonProperty(PropertyName = "playbackType")]
|
||||||
[Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))]
|
[Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))]
|
||||||
[System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))]
|
[System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))]
|
||||||
[JsonPropertyName("playbackType")]
|
[JsonPropertyName("playbackType")]
|
||||||
public PlaybackType PlaybackType { get; set; } = PlaybackType.playStop;
|
public PlaybackType PlaybackType { get; set; } = PlaybackType.playStop;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,158 +1,287 @@
|
|||||||
using System;
|
using BarRaider.SdTools;
|
||||||
using System.Collections.Generic;
|
using ClipTrimDotNet.Keys;
|
||||||
using System.Linq;
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||||
using System.Net.Http;
|
using Newtonsoft.Json;
|
||||||
using System.Text;
|
using SocketIOClient;
|
||||||
using System.Threading.Tasks;
|
using System;
|
||||||
using Newtonsoft.Json;
|
using System.Collections.Generic;
|
||||||
using SocketIOClient;
|
using System.Linq;
|
||||||
using BarRaider.SdTools;
|
using System.Net.Http;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Text;
|
||||||
namespace ClipTrimDotNet.Client
|
using System.Threading.Tasks;
|
||||||
{
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
public class ClipTrimClient
|
|
||||||
{
|
namespace ClipTrimDotNet.Client
|
||||||
private static ClipTrimClient? instance;
|
{
|
||||||
public static ClipTrimClient Instance
|
public class ClipTrimClient
|
||||||
{
|
{
|
||||||
get
|
private static ClipTrimClient? instance;
|
||||||
{
|
public static ClipTrimClient Instance
|
||||||
if (instance == null)
|
{
|
||||||
{
|
get
|
||||||
instance = new ClipTrimClient();
|
{
|
||||||
}
|
if (instance == null)
|
||||||
return instance;
|
{
|
||||||
}
|
instance = new ClipTrimClient();
|
||||||
}
|
}
|
||||||
|
return instance;
|
||||||
//private HttpClient httpClient;
|
}
|
||||||
private SocketIO socket;
|
}
|
||||||
|
|
||||||
public int PortNumber { get; set; } = 5010;
|
//private HttpClient httpClient;
|
||||||
|
private SocketIO? socket;
|
||||||
public ClipTrimClient()
|
|
||||||
{
|
public string HostName
|
||||||
//httpClient = new HttpClient()
|
{
|
||||||
//{
|
get
|
||||||
// BaseAddress = new Uri("http://localhost:5010/"),
|
{
|
||||||
// Timeout = TimeSpan.FromSeconds(10)
|
//return $"http://localhost:5010/";
|
||||||
//};
|
return $"http://localhost:{GlobalSettings.Instance.PortNumber}/";
|
||||||
Logger.Instance.LogMessage(TracingLevel.INFO, $"Starting ClipTrimClient on port {PortNumber}");
|
}
|
||||||
socket = new SocketIO(new Uri($"http://localhost:5010/"));
|
}
|
||||||
socket.Options.AutoUpgrade = false;
|
|
||||||
socket.Options.ConnectionTimeout = TimeSpan.FromSeconds(10);
|
private string? currentHostname = null;
|
||||||
socket.Options.Reconnection = true;
|
|
||||||
socket.On("full_data", ctx =>
|
void CreateSocket()
|
||||||
{
|
{
|
||||||
try
|
Logger.Instance.LogMessage(TracingLevel.INFO, $"Starting ClipTrimClient on port {HostName}");
|
||||||
{
|
socket = new SocketIO(new Uri(HostName));
|
||||||
var response = ctx.GetValue<List<CollectionMetaData>>(0);
|
currentHostname = HostName;
|
||||||
Logger.Instance.LogMessage(TracingLevel.INFO, $"full_data event {JsonConvert.SerializeObject(response)}");
|
socket.Options.AutoUpgrade = false;
|
||||||
Collections = response!;
|
//socket.Options.Path = "/socket.io";
|
||||||
//Logger.Instance.LogMessage(TracingLevel.INFO, $"Collections {JsonConvert.SerializeObject(Collections)}");
|
socket.Options.ConnectionTimeout = TimeSpan.FromSeconds(10);
|
||||||
}
|
socket.Options.Reconnection = true;
|
||||||
catch (Exception ex)
|
socket.On("full_data", ctx =>
|
||||||
{
|
{
|
||||||
Logger.Instance.LogMessage(TracingLevel.INFO, $"full_data error {ex.ToString()}");
|
try
|
||||||
}
|
{
|
||||||
return Task.CompletedTask;
|
var response = ctx.GetValue<List<CollectionMetaData>>(0);
|
||||||
});
|
Logger.Instance.LogMessage(TracingLevel.INFO, $"full_data event {JsonConvert.SerializeObject(response)}");
|
||||||
socket.On("collection_updated", ctx =>
|
Collections = response!;
|
||||||
{
|
Player.TickAll();
|
||||||
try
|
PageNavigator.TickAll();
|
||||||
{
|
//Logger.Instance.LogMessage(TracingLevel.INFO, $"Collections {JsonConvert.SerializeObject(Collections)}");
|
||||||
var response = ctx.GetValue<CollectionMetaData>(0)!;
|
}
|
||||||
Logger.Instance.LogMessage(TracingLevel.INFO, $"collection_updated event {JsonConvert.SerializeObject(response)}");
|
catch (Exception ex)
|
||||||
int index = Collections.FindIndex(x => x.Id == response.Id);
|
{
|
||||||
if (index != -1)
|
Logger.Instance.LogMessage(TracingLevel.INFO, $"full_data error {ex.ToString()}");
|
||||||
{
|
}
|
||||||
Collections[index] = response;
|
return Task.CompletedTask;
|
||||||
}
|
});
|
||||||
}
|
socket.On("collection_updated", ctx =>
|
||||||
catch
|
{
|
||||||
{
|
try
|
||||||
|
{
|
||||||
}
|
var response = ctx.GetValue<CollectionMetaData>(0)!;
|
||||||
|
Logger.Instance.LogMessage(TracingLevel.INFO, $"collection_updated event {JsonConvert.SerializeObject(response)}");
|
||||||
return Task.CompletedTask;
|
int index = Collections.FindIndex(x => x.Id == response.Id);
|
||||||
});
|
if (index != -1)
|
||||||
|
{
|
||||||
Task.Run(async () => await socket.ConnectAsync());
|
Collections[index] = response;
|
||||||
//Task.Run(ShortPoll);
|
Player.TickAll();
|
||||||
}
|
PageNavigator.TickAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
//public async Task ShortPoll()
|
catch
|
||||||
//{
|
{
|
||||||
// while (true)
|
|
||||||
// {
|
}
|
||||||
// await GetMetadata();
|
|
||||||
// await Task.Delay(TimeSpan.FromSeconds(5)); await Task.Delay(TimeSpan.FromSeconds(5));
|
return Task.CompletedTask;
|
||||||
|
});
|
||||||
// }
|
|
||||||
//}
|
socket.OnConnected += (sender, e) =>
|
||||||
|
{
|
||||||
public List<CollectionMetaData> Collections { get; private set; } = new List<CollectionMetaData>();
|
Logger.Instance.LogMessage(TracingLevel.INFO, $"Socket connected: {e}");
|
||||||
public int SelectedCollection { get; private set; } = -1;
|
};
|
||||||
public int PageIndex { get; private set; } = 0;
|
|
||||||
//private async Task GetMetadata()
|
socket.OnDisconnected += (sender, e) =>
|
||||||
//{
|
{
|
||||||
// try
|
Logger.Instance.LogMessage(TracingLevel.INFO, $"Socket disconnected: {e}");
|
||||||
// {
|
Task.Run(async () => await Connect());
|
||||||
// var response = await httpClient.GetAsync("meta");
|
};
|
||||||
// if (response.IsSuccessStatusCode)
|
Task.Run(async () => await Connect());
|
||||||
// {
|
}
|
||||||
// var json = await response.Content.ReadAsStringAsync();
|
|
||||||
// dynamic collections = JsonConvert.DeserializeObject(json);
|
public ClipTrimClient()
|
||||||
// collections = collections.collections;
|
{
|
||||||
// Collections = JsonConvert.DeserializeObject<List<CollectionMetaData>>(collections.ToString());
|
//httpClient = new HttpClient()
|
||||||
// }
|
//{
|
||||||
// }
|
// BaseAddress = new Uri("http://localhost:5010/"),
|
||||||
// catch (Exception ex)
|
// Timeout = TimeSpan.FromSeconds(10)
|
||||||
// {
|
//};
|
||||||
// //Logger.Instance.LogMessage(TracingLevel.INFO, $"Error pinging ClipTrim API: {ex.Message}");
|
CreateSocket();
|
||||||
// return;
|
}
|
||||||
// }
|
|
||||||
|
public async Task Connect()
|
||||||
//}
|
{
|
||||||
|
if (socket is null) return;
|
||||||
public List<string> GetCollectionNames()
|
while (!socket.Connected)
|
||||||
{
|
{
|
||||||
//await GetMetadata();
|
try
|
||||||
return Collections.Select(x => x.Name).ToList();
|
{
|
||||||
}
|
await socket.ConnectAsync();
|
||||||
|
}
|
||||||
public void SetSelectedCollectionByName(string name)
|
catch
|
||||||
{
|
{
|
||||||
SelectedCollection = Collections.FindIndex(x => x.Name == name);
|
|
||||||
if (SelectedCollection != -1)
|
}
|
||||||
{
|
}
|
||||||
PageIndex = 0;
|
}
|
||||||
}
|
|
||||||
}
|
public List<CollectionMetaData> Collections { get; private set; } = new List<CollectionMetaData>();
|
||||||
|
public int SelectedCollection { get; private set; } = -1;
|
||||||
public ClipMetadata? GetClipByPagedIndex(int index)
|
|
||||||
{
|
public Dictionary<int, int> CollectionIndexes { get; private set; } = new();
|
||||||
if (SelectedCollection == -1) return null;
|
public int PageIndex
|
||||||
int clipIndex = PageIndex * 10 + index;
|
{
|
||||||
var collection = Collections[SelectedCollection];
|
get
|
||||||
if (clipIndex >= 0 && clipIndex < collection.Clips.Count)
|
{
|
||||||
{
|
if (SelectedCollection == -1) return 0;
|
||||||
return collection.Clips[clipIndex];
|
if (!CollectionIndexes.ContainsKey(SelectedCollection))
|
||||||
}
|
{
|
||||||
return null;
|
CollectionIndexes[SelectedCollection] = 0;
|
||||||
}
|
}
|
||||||
|
return CollectionIndexes[SelectedCollection];
|
||||||
public async void PlayClip(ClipMetadata? metadata)
|
}
|
||||||
{
|
set
|
||||||
if (metadata == null) return;
|
{
|
||||||
|
if (SelectedCollection == -1) return;
|
||||||
//var response = await httpClient.PostAsync("playback/start", new StringContent(JsonConvert.SerializeObject(metadata), Encoding.UTF8, "application/json"));
|
CollectionIndexes[SelectedCollection] = value;
|
||||||
//if (!response.IsSuccessStatusCode)
|
}
|
||||||
//{
|
}
|
||||||
// //Logger.Instance.LogMessage(TracingLevel.INFO, $"Error playing clip: {response.ReasonPhrase}");
|
public bool PageMode { get; set; } = false;
|
||||||
//}
|
|
||||||
}
|
public int PageCount
|
||||||
}
|
{
|
||||||
}
|
get
|
||||||
|
{
|
||||||
|
if (SelectedCollection == -1) return 0;
|
||||||
|
var collection = Collections[SelectedCollection];
|
||||||
|
return (collection.Clips.Count - 1) / 10 + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool CanPageUp
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if(PageMode) return false;
|
||||||
|
if (SelectedCollection == -1) return false;
|
||||||
|
return PageCount - PageIndex > 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CanPageDown
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (PageMode) return false;
|
||||||
|
return PageIndex > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PageDown()
|
||||||
|
{
|
||||||
|
if (CanPageDown)
|
||||||
|
{
|
||||||
|
PageIndex--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PageUp()
|
||||||
|
{
|
||||||
|
if (CanPageUp)
|
||||||
|
{
|
||||||
|
PageIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public List<string> GetCollectionNames()
|
||||||
|
{
|
||||||
|
//await GetMetadata();
|
||||||
|
return Collections.Where(x => x.Name != "Uncategorized").Select(x => x.Name).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetCurrentCollectionName()
|
||||||
|
{
|
||||||
|
if (SelectedCollection == -1) return "";
|
||||||
|
return Collections[SelectedCollection].Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetPlayerStringByCoordinateIndex(int index)
|
||||||
|
{
|
||||||
|
if (PageMode)
|
||||||
|
{
|
||||||
|
int pageNumber = index + 1;
|
||||||
|
if(pageNumber <= PageCount)
|
||||||
|
{
|
||||||
|
return pageNumber.ToString();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var collection = GetClipByPagedIndex(index);
|
||||||
|
return collection?.Name ?? "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public ClipMetadata? GetClipByPagedIndex(int index)
|
||||||
|
{
|
||||||
|
SelectedCollection = Collections.FindIndex(x => x.Name == GlobalSettings.Instance.ProfileName);
|
||||||
|
if (SelectedCollection == -1) return null;
|
||||||
|
int clipIndex = PageIndex * 10 + index;
|
||||||
|
var collection = Collections[SelectedCollection];
|
||||||
|
if (clipIndex >= 0 && clipIndex < collection.Clips.Count)
|
||||||
|
{
|
||||||
|
return collection.Clips[clipIndex];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void PlayClip(int index)
|
||||||
|
{
|
||||||
|
if (PageMode)
|
||||||
|
{
|
||||||
|
if(index < 0 || index >= PageCount) return;
|
||||||
|
PageIndex = index;
|
||||||
|
PageMode = false;
|
||||||
|
Player.TickAll();
|
||||||
|
PageNavigator.TickAll();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (socket is null) return;
|
||||||
|
var metadata = GetClipByPagedIndex(index);
|
||||||
|
if (metadata == null) return;
|
||||||
|
//Logger.Instance.LogMessage(TracingLevel.INFO, $"playing clip:");
|
||||||
|
await socket.EmitAsync("play_clip", new List<object>() { metadata });
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void SaveClip()
|
||||||
|
{
|
||||||
|
if (socket is null) return;
|
||||||
|
await socket.EmitAsync("record_clip", new List<object>() { });
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void CheckPort()
|
||||||
|
{
|
||||||
|
if (socket is null) return;
|
||||||
|
//Logger.Instance.LogMessage(TracingLevel.INFO, $"Checking port {socket}");
|
||||||
|
if (currentHostname != HostName)
|
||||||
|
{
|
||||||
|
//Logger.Instance.LogMessage(TracingLevel.INFO, $"port {socket}");
|
||||||
|
if (socket.Connected)
|
||||||
|
{
|
||||||
|
await socket.DisconnectAsync();
|
||||||
|
}
|
||||||
|
socket.Dispose();
|
||||||
|
CreateSocket();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,27 +1,27 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace ClipTrimDotNet.Client
|
namespace ClipTrimDotNet.Client
|
||||||
{
|
{
|
||||||
public class CollectionMetaData
|
public class CollectionMetaData
|
||||||
{
|
{
|
||||||
[JsonProperty(PropertyName = "name")]
|
[JsonProperty(PropertyName = "name")]
|
||||||
[JsonPropertyName("name")]
|
[JsonPropertyName("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "clips")]
|
[JsonProperty(PropertyName = "clips")]
|
||||||
[JsonPropertyName("clips")]
|
[JsonPropertyName("clips")]
|
||||||
public List<ClipMetadata> Clips { get; set; } = new List<ClipMetadata>();
|
public List<ClipMetadata> Clips { get; set; } = new List<ClipMetadata>();
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "id")]
|
[JsonProperty(PropertyName = "id")]
|
||||||
[JsonPropertyName("id")]
|
[JsonPropertyName("id")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,95 +1,118 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0-windows</TargetFramework>
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<LangVersion>10</LangVersion>
|
<LangVersion>10</LangVersion>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<PreBuildEvent>npm run stop</PreBuildEvent>
|
<PreBuildEvent>npm run stop</PreBuildEvent>
|
||||||
<PostBuildEvent>npm run start</PostBuildEvent>
|
<PostBuildEvent>npm run start</PostBuildEvent>
|
||||||
<AssemblyTitle>ClipTrimDotNet</AssemblyTitle>
|
<AssemblyTitle>ClipTrimDotNet</AssemblyTitle>
|
||||||
<Product>ClipTrimDotNet</Product>
|
<Product>ClipTrimDotNet</Product>
|
||||||
<Copyright>Copyright © 2020</Copyright>
|
<Copyright>Copyright © 2020</Copyright>
|
||||||
<AssemblyVersion>1.0.0.0</AssemblyVersion>
|
<AssemblyVersion>1.0.0.0</AssemblyVersion>
|
||||||
<FileVersion>1.0.0.0</FileVersion>
|
<FileVersion>1.0.0.0</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<OutputPath>bin\Debug\com.michal-courson.cliptrim.sdPlugin\</OutputPath>
|
<OutputPath>bin\Debug\com.michal-courson.cliptrim.sdPlugin\</OutputPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
<OutputPath>bin\Release\ClipTrimDotNet.sdPlugin\</OutputPath>
|
<OutputPath>bin\Release\ClipTrimDotNet.sdPlugin\</OutputPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CommandLineParser" Version="2.9.1" />
|
<None Remove="Images\app_icon.png" />
|
||||||
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" />
|
<None Remove="Images\back.png" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.2" />
|
<None Remove="Images\category_icon.png" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.2" />
|
<None Remove="Images\collection.png" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.2" />
|
<None Remove="Images\collection_icon.png" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.2" />
|
<None Remove="Images\page_nav.png" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.2" />
|
<None Remove="Images\page_nav_icon.png" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Primitives" Version="10.0.2" />
|
<None Remove="Images\player.png" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
<None Remove="Images\player_icon.png" />
|
||||||
<PackageReference Include="NLog" Version="6.0.5" />
|
<None Remove="Images\record.png" />
|
||||||
<PackageReference Include="SocketIOClient" Version="4.0.0.2" />
|
<None Remove="Images\record_icon.png" />
|
||||||
<PackageReference Include="SocketIOClient.Common" Version="4.0.0" />
|
<None Remove="manifest.json" />
|
||||||
<PackageReference Include="SocketIOClient.Serializer" Version="4.0.0.1" />
|
</ItemGroup>
|
||||||
<PackageReference Include="SocketIOClient.Serializer.NewtonsoftJson" Version="4.0.0.1" />
|
<ItemGroup>
|
||||||
<PackageReference Include="StreamDeck-Tools" Version="6.3.2" />
|
<PackageReference Include="CommandLineParser" Version="2.9.1" />
|
||||||
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="10.0.2" />
|
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" />
|
||||||
<PackageReference Include="System.Drawing.Common" Version="9.0.10" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.2" />
|
||||||
<PackageReference Include="System.IO.Pipelines" Version="10.0.2" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.2" />
|
||||||
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.2" />
|
||||||
<PackageReference Include="System.Security.AccessControl" Version="6.0.1" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.2" />
|
||||||
<PackageReference Include="System.Text.Encodings.Web" Version="10.0.2" />
|
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.2" />
|
||||||
<PackageReference Include="System.Text.Json" Version="10.0.2" />
|
<PackageReference Include="Microsoft.Extensions.Primitives" Version="10.0.2" />
|
||||||
<PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||||
<PackageReference Include="CoreWCF.Primitives" Version="1.8.0" />
|
<PackageReference Include="NLog" Version="6.0.5" />
|
||||||
<PackageReference Include="CoreWCF.ConfigurationManager" Version="1.8.0" />
|
<PackageReference Include="SocketIOClient" Version="4.0.0.2" />
|
||||||
<PackageReference Include="CoreWCF.Http" Version="1.8.0" />
|
<PackageReference Include="SocketIOClient.Common" Version="4.0.0" />
|
||||||
<PackageReference Include="CoreWCF.WebHttp" Version="1.8.0" />
|
<PackageReference Include="SocketIOClient.Serializer" Version="4.0.0.1" />
|
||||||
<PackageReference Include="CoreWCF.NetTcp" Version="1.8.0" />
|
<PackageReference Include="SocketIOClient.Serializer.NewtonsoftJson" Version="4.0.0.1" />
|
||||||
</ItemGroup>
|
<PackageReference Include="StreamDeck-Tools" Version="6.3.2" />
|
||||||
<ItemGroup>
|
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="10.0.2" />
|
||||||
<None Update="DialLayout.json">
|
<PackageReference Include="System.Drawing.Common" Version="9.0.10" />
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<PackageReference Include="System.IO.Pipelines" Version="10.0.2" />
|
||||||
</None>
|
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
|
||||||
<None Update="manifest.json">
|
<PackageReference Include="System.Security.AccessControl" Version="6.0.1" />
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<PackageReference Include="System.Text.Encodings.Web" Version="10.0.2" />
|
||||||
</None>
|
<PackageReference Include="System.Text.Json" Version="10.0.2" />
|
||||||
</ItemGroup>
|
<PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
|
||||||
<ItemGroup>
|
<PackageReference Include="CoreWCF.Primitives" Version="1.8.0" />
|
||||||
<Content Include="!!README!!.txt" />
|
<PackageReference Include="CoreWCF.ConfigurationManager" Version="1.8.0" />
|
||||||
<Content Include="Images\categoryIcon%402x.png">
|
<PackageReference Include="CoreWCF.Http" Version="1.8.0" />
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<PackageReference Include="CoreWCF.WebHttp" Version="1.8.0" />
|
||||||
</Content>
|
<PackageReference Include="CoreWCF.NetTcp" Version="1.8.0" />
|
||||||
<Content Include="Images\categoryIcon.png">
|
</ItemGroup>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<ItemGroup>
|
||||||
</Content>
|
<None Update="DialLayout.json">
|
||||||
<Content Include="Images\icon%402x.png">
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
</None>
|
||||||
</Content>
|
</ItemGroup>
|
||||||
<Content Include="Images\icon.png">
|
<ItemGroup>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<Content Include="!!README!!.txt" />
|
||||||
</Content>
|
<Content Include="Images\app_icon.png">
|
||||||
<Content Include="Images\pluginAction%402x.png">
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
</Content>
|
||||||
</Content>
|
<Content Include="Images\back.png">
|
||||||
<Content Include="Images\pluginAction.png">
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
</Content>
|
||||||
</Content>
|
<Content Include="Images\category_icon.png">
|
||||||
<Content Include="Images\pluginIcon%402x.png">
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
</Content>
|
||||||
</Content>
|
<Content Include="Images\collection.png">
|
||||||
<Content Include="Images\pluginIcon.png">
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
</Content>
|
||||||
</Content>
|
<Content Include="Images\collection_icon.png">
|
||||||
<Content Include="package.json" />
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<Content Include="PropertyInspector\profile_swticher.html">
|
</Content>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<Content Include="Images\page_nav.png">
|
||||||
</Content>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<Content Include="PropertyInspector\file_player.html">
|
</Content>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<Content Include="Images\page_nav_icon.png">
|
||||||
</Content>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</ItemGroup>
|
</Content>
|
||||||
|
<Content Include="Images\player_icon.png">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Images\record.png">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Images\player.png">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Images\record_icon.png">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="manifest.json">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="package.json" />
|
||||||
|
<Content Include="PropertyInspector\profile_swticher.html">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="PropertyInspector\file_player.html">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
||||||
<StartArguments>--port 23654 --pluginUUID com.michal-courson.cliptrim --registerEvent restart --info {}</StartArguments>
|
<StartArguments>--port 23654 --pluginUUID com.michal-courson.cliptrim --registerEvent restart --info {}</StartArguments>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@ -1,40 +1,40 @@
|
|||||||
{
|
{
|
||||||
"id": "sampleDial",
|
"id": "sampleDial",
|
||||||
"items": [
|
"items": [
|
||||||
{
|
{
|
||||||
"key": "title",
|
"key": "title",
|
||||||
"type": "text",
|
"type": "text",
|
||||||
"rect": [ 16, 10, 136, 24 ],
|
"rect": [ 16, 10, 136, 24 ],
|
||||||
"font": {
|
"font": {
|
||||||
"size": 16,
|
"size": 16,
|
||||||
"weight": 600
|
"weight": 600
|
||||||
},
|
},
|
||||||
"alignment": "left"
|
"alignment": "left"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "icon",
|
"key": "icon",
|
||||||
"type": "pixmap",
|
"type": "pixmap",
|
||||||
"rect": [ 16, 40, 48, 48 ]
|
"rect": [ 16, 40, 48, 48 ]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "value",
|
"key": "value",
|
||||||
"type": "text",
|
"type": "text",
|
||||||
"rect": [ 76, 40, 108, 32 ],
|
"rect": [ 76, 40, 108, 32 ],
|
||||||
"font": {
|
"font": {
|
||||||
"size": 24,
|
"size": 24,
|
||||||
"weight": 600
|
"weight": 600
|
||||||
},
|
},
|
||||||
"alignment": "right"
|
"alignment": "right"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "indicator",
|
"key": "indicator",
|
||||||
"type": "gbar",
|
"type": "gbar",
|
||||||
"rect": [ 76, 74, 108, 20 ],
|
"rect": [ 76, 74, 108, 20 ],
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"subtype": 4,
|
"subtype": 4,
|
||||||
"bar_h": 12,
|
"bar_h": 12,
|
||||||
"border_w": 0,
|
"border_w": 0,
|
||||||
"bar_bg_c": "0:#427018,0.75:#705B1C,0.90:#702735,1:#702735"
|
"bar_bg_c": "0:#427018,0.75:#705B1C,0.90:#702735,1:#702735"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -1,108 +1,49 @@
|
|||||||
using BarRaider.SdTools;
|
using BarRaider.SdTools;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using BarRaider.SdTools.Wrappers;
|
using BarRaider.SdTools.Wrappers;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace ClipTrimDotNet
|
namespace ClipTrimDotNet
|
||||||
{
|
{
|
||||||
public class FileEntry
|
public class GlobalSettings
|
||||||
{
|
{
|
||||||
public FileEntry()
|
public static GlobalSettings? _inst;
|
||||||
{
|
public static GlobalSettings Instance
|
||||||
Volume = 1.0;
|
{
|
||||||
Playtype = "Play/Overlap";
|
get
|
||||||
}
|
{
|
||||||
[JsonProperty(PropertyName = "Volume")]
|
_inst ??= CreateDefaultSettings();
|
||||||
public double Volume { get; set; }
|
return _inst;
|
||||||
[JsonProperty(PropertyName = "Playtype")]
|
}
|
||||||
public string Playtype { get; set; }
|
set
|
||||||
}
|
{
|
||||||
public class CollectionEntry
|
_inst = value;
|
||||||
{
|
}
|
||||||
public CollectionEntry()
|
}
|
||||||
{
|
public static GlobalSettings CreateDefaultSettings()
|
||||||
Files = new Dictionary<string, FileEntry>();
|
{
|
||||||
}
|
GlobalSettings instance = new GlobalSettings();
|
||||||
[JsonProperty(PropertyName = "Files")]
|
instance.ProfileName = null;
|
||||||
public Dictionary<string, FileEntry> Files { get; set; }
|
instance.PortNumber = 5010;
|
||||||
}
|
return instance;
|
||||||
|
}
|
||||||
public class GlobalSettings
|
|
||||||
{
|
|
||||||
public static GlobalSettings? _inst;
|
[JsonProperty(PropertyName = "profileName")]
|
||||||
public static GlobalSettings Instance
|
public string? ProfileName { get; set; }
|
||||||
{
|
|
||||||
get
|
[JsonProperty(PropertyName = "portNumber")]
|
||||||
{
|
public int? PortNumber { get; set; }
|
||||||
_inst ??= CreateDefaultSettings();
|
|
||||||
return _inst;
|
|
||||||
}
|
public void SetCurrentProfile(string profile)
|
||||||
set
|
{
|
||||||
{
|
ProfileName = profile;
|
||||||
_inst = value;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static GlobalSettings CreateDefaultSettings()
|
|
||||||
{
|
|
||||||
GlobalSettings instance = new GlobalSettings();
|
|
||||||
instance.BasePath = null;
|
|
||||||
instance.ProfileName = null;
|
|
||||||
instance.Collections = new Dictionary<string, CollectionEntry>();
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[FilenameProperty]
|
|
||||||
[JsonProperty(PropertyName = "basePath")]
|
|
||||||
public string? BasePath { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "profileName")]
|
|
||||||
public string? ProfileName { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "outputDevice")]
|
|
||||||
public string? OutputDevice { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "collections")]
|
|
||||||
public Dictionary<string, CollectionEntry> Collections { get; set; }
|
|
||||||
|
|
||||||
public void SetCurrentProfile(string profile)
|
|
||||||
{
|
|
||||||
ProfileName = profile;
|
|
||||||
if(!Collections.ContainsKey(profile))
|
|
||||||
{
|
|
||||||
Collections.Add(profile, new CollectionEntry());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public FileEntry GetFileOptionsInCurrentProfile(string filename)
|
|
||||||
{
|
|
||||||
if(!Collections.TryGetValue(ProfileName, out CollectionEntry collection))
|
|
||||||
{
|
|
||||||
return new FileEntry();
|
|
||||||
}
|
|
||||||
if(!collection.Files.TryGetValue(filename, out FileEntry file))
|
|
||||||
{
|
|
||||||
return new FileEntry();
|
|
||||||
}
|
|
||||||
//Logger.Instance.LogMessage(TracingLevel.INFO, "fetched file settings " + filename + JsonConvert.SerializeObject(file));
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetFileOptionsCurrentProfile(string filename, FileEntry file)
|
|
||||||
{
|
|
||||||
//Logger.Instance.LogMessage(TracingLevel.INFO, "SetFileOptionsCurrentProfile ");
|
|
||||||
if (!Collections.TryGetValue(ProfileName, out CollectionEntry collection))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//Logger.Instance.LogMessage(TracingLevel.INFO, "SetFileOptionsCurrentProfile 2");
|
|
||||||
//collection.Files[filename] = file;
|
|
||||||
Collections[ProfileName].Files[filename] = file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
BIN
stream_deck_plugin/ClipTrimDotNet/Images/app_icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
stream_deck_plugin/ClipTrimDotNet/Images/app_icon.psd
Normal file
BIN
stream_deck_plugin/ClipTrimDotNet/Images/back.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
stream_deck_plugin/ClipTrimDotNet/Images/back.psd
Normal file
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
BIN
stream_deck_plugin/ClipTrimDotNet/Images/category_icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
stream_deck_plugin/ClipTrimDotNet/Images/collection.png
Normal file
|
After Width: | Height: | Size: 464 B |
BIN
stream_deck_plugin/ClipTrimDotNet/Images/collection.psd
Normal file
BIN
stream_deck_plugin/ClipTrimDotNet/Images/collection_icon.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
stream_deck_plugin/ClipTrimDotNet/Images/collection_icon.psd
Normal file
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 7.5 KiB |
BIN
stream_deck_plugin/ClipTrimDotNet/Images/page_nav.png
Normal file
|
After Width: | Height: | Size: 484 B |
BIN
stream_deck_plugin/ClipTrimDotNet/Images/page_nav.psd
Normal file
BIN
stream_deck_plugin/ClipTrimDotNet/Images/page_nav_icon.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |