diff --git a/plugins/python-codecs/package-lock.json b/plugins/python-codecs/package-lock.json index 8a87d7807..2f5136aba 100644 --- a/plugins/python-codecs/package-lock.json +++ b/plugins/python-codecs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/python-codecs", - "version": "0.1.90", + "version": "0.1.91", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/python-codecs", - "version": "0.1.90", + "version": "0.1.91", "devDependencies": { "@scrypted/sdk": "file:../../sdk" } diff --git a/plugins/python-codecs/package.json b/plugins/python-codecs/package.json index bda0051a0..a7c8938b1 100644 --- a/plugins/python-codecs/package.json +++ b/plugins/python-codecs/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/python-codecs", - "version": "0.1.90", + "version": "0.1.91", "description": "Python Codecs for Scrypted", "keywords": [ "scrypted", diff --git a/plugins/python-codecs/src/main.py b/plugins/python-codecs/src/main.py index 034ddb267..e28190526 100644 --- a/plugins/python-codecs/src/main.py +++ b/plugins/python-codecs/src/main.py @@ -173,17 +173,6 @@ class PythonCodecs(scrypted_sdk.ScryptedDeviceBase, scrypted_sdk.DeviceProvider) } ) - manifest["devices"].append( - { - "name": "Image Writer", - "type": scrypted_sdk.ScryptedDeviceType.Builtin.value, - "nativeId": "writer", - "interfaces": [ - scrypted_sdk.ScryptedInterface.BufferConverter.value, - ], - } - ) - await scrypted_sdk.deviceManager.onDevicesChanged(manifest) def getDevice(self, nativeId: str) -> Any: @@ -198,13 +187,9 @@ class PythonCodecs(scrypted_sdk.ScryptedDeviceBase, scrypted_sdk.DeviceProvider) if vipsimage.pyvips: if nativeId == "reader": return vipsimage.ImageReader("reader") - if nativeId == "writer": - return vipsimage.ImageWriter("writer") else: if nativeId == "reader": return pilimage.ImageReader("reader") - if nativeId == "writer": - return pilimage.ImageWriter("writer") def create_scrypted_plugin(): diff --git a/plugins/python-codecs/src/pilimage.py b/plugins/python-codecs/src/pilimage.py index 870cd58f5..3a3e7fa52 100644 --- a/plugins/python-codecs/src/pilimage.py +++ b/plugins/python-codecs/src/pilimage.py @@ -114,18 +114,6 @@ class ImageReader(scrypted_sdk.ScryptedDeviceBase, scrypted_sdk.BufferConverter) pil.load() return await createImageMediaObject(PILImage(pil)) -class ImageWriter(scrypted_sdk.ScryptedDeviceBase, scrypted_sdk.BufferConverter): - def __init__(self, nativeId: str): - super().__init__(nativeId) - - self.fromMimeType = scrypted_sdk.ScryptedMimeTypes.Image.value - self.toMimeType = 'image/*' - - async def convert(self, data: scrypted_sdk.VideoFrame, fromMimeType: str, toMimeType: str, options: scrypted_sdk.MediaObjectOptions = None) -> Any: - return await data.toBuffer({ - format: 'jpg', - }) - def new_from_memory(data, width: int, height: int, bands: int): data = bytes(data) if bands == 4: diff --git a/plugins/python-codecs/src/vipsimage.py b/plugins/python-codecs/src/vipsimage.py index 499edc64b..ce8018417 100644 --- a/plugins/python-codecs/src/vipsimage.py +++ b/plugins/python-codecs/src/vipsimage.py @@ -110,21 +110,3 @@ class ImageReader(scrypted_sdk.ScryptedDeviceBase, scrypted_sdk.BufferConverter) async def convert(self, data: Any, fromMimeType: str, toMimeType: str, options: scrypted_sdk.MediaObjectOptions = None) -> Any: vips = Image.new_from_buffer(data, '') return await createImageMediaObject(VipsImage(vips)) - -class ImageWriter(scrypted_sdk.ScryptedDeviceBase, scrypted_sdk.BufferConverter): - def __init__(self, nativeId: str): - super().__init__(nativeId) - - self.fromMimeType = scrypted_sdk.ScryptedMimeTypes.Image.value - self.toMimeType = 'image/*' - - async def convert(self, data: scrypted_sdk.VideoFrame, fromMimeType: str, toMimeType: str, options: scrypted_sdk.MediaObjectOptions = None) -> Any: - return await data.toBuffer({ - format: 'jpg', - }) - -def new_from_memory(data, width: int, height: int, bands: int): - return Image.new_from_memory(data, width, height, bands, pyvips.BandFormat.UCHAR) - -def new_from_buffer(data, width: int, height: int, bands: int): - return Image.new_from_buffer(data, width, height, bands, pyvips.BandFormat.UCHAR) diff --git a/plugins/snapshot/package-lock.json b/plugins/snapshot/package-lock.json index b9447c902..d5964b57b 100644 --- a/plugins/snapshot/package-lock.json +++ b/plugins/snapshot/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/snapshot", - "version": "0.0.66", + "version": "0.0.67", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/snapshot", - "version": "0.0.66", + "version": "0.0.67", "dependencies": { "@koush/axios-digest-auth": "^0.8.5", "@types/node": "^18.16.18", diff --git a/plugins/snapshot/package.json b/plugins/snapshot/package.json index 8e05ce1d3..9c4109683 100644 --- a/plugins/snapshot/package.json +++ b/plugins/snapshot/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/snapshot", - "version": "0.0.66", + "version": "0.0.67", "description": "Snapshot Plugin for Scrypted", "scripts": { "scrypted-setup-project": "scrypted-setup-project", @@ -28,7 +28,8 @@ "interfaces": [ "Settings", "MixinProvider", - "BufferConverter" + "BufferConverter", + "DeviceProvider" ] }, "dependencies": { diff --git a/plugins/snapshot/src/image-writer.ts b/plugins/snapshot/src/image-writer.ts new file mode 100644 index 000000000..4eb01be38 --- /dev/null +++ b/plugins/snapshot/src/image-writer.ts @@ -0,0 +1,18 @@ +import { BufferConverter, Image, MediaObjectOptions, ScryptedDeviceBase, ScryptedMimeTypes, ScryptedNativeId } from "@scrypted/sdk"; + +export const ImageWriterNativeId = 'imagewriter'; +export class ImageWriter extends ScryptedDeviceBase implements BufferConverter { + constructor(nativeId: ScryptedNativeId) { + super(nativeId) + + this.fromMimeType = ScryptedMimeTypes.Image; + this.toMimeType = 'image/*'; + } + + async convert(data: any, fromMimeType: string, toMimeType: string, options?: MediaObjectOptions): Promise { + const image = data as Image; + return image.toBuffer({ + format: 'jpg', + }); + } +} diff --git a/plugins/snapshot/src/main.ts b/plugins/snapshot/src/main.ts index d18b46bd1..7ad8d0eb1 100644 --- a/plugins/snapshot/src/main.ts +++ b/plugins/snapshot/src/main.ts @@ -2,13 +2,14 @@ import AxiosDigestAuth from '@koush/axios-digest-auth'; import { AutoenableMixinProvider } from "@scrypted/common/src/autoenable-mixin-provider"; import { createMapPromiseDebouncer, RefreshPromise, singletonPromise, TimeoutError } from "@scrypted/common/src/promise-utils"; import { SettingsMixinDeviceBase, SettingsMixinDeviceOptions } from "@scrypted/common/src/settings-mixin"; -import sdk, { BufferConverter, Camera, FFmpegInput, Image, MediaObject, MediaObjectOptions, MixinProvider, RequestMediaStreamOptions, RequestPictureOptions, ResponsePictureOptions, ScryptedDevice, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, Setting, Settings, SettingValue, VideoCamera } from "@scrypted/sdk"; +import sdk, { BufferConverter, Camera, DeviceProvider, FFmpegInput, Image, MediaObject, MediaObjectOptions, MixinProvider, RequestMediaStreamOptions, RequestPictureOptions, ResponsePictureOptions, ScryptedDevice, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, Setting, Settings, SettingValue, VideoCamera } from "@scrypted/sdk"; import { StorageSettings } from "@scrypted/sdk/storage-settings"; import axios, { AxiosInstance } from "axios"; import https from 'https'; import path from 'path'; import MimeType from 'whatwg-mimetype'; import { ffmpegFilterImage, ffmpegFilterImageBuffer } from './ffmpeg-image-filter'; +import { ImageWriter, ImageWriterNativeId } from './image-writer'; const { mediaManager, systemManager } = sdk; @@ -519,7 +520,7 @@ export function parseDims(dict: DimDict) { return ret; } -class SnapshotPlugin extends AutoenableMixinProvider implements MixinProvider, BufferConverter, Settings { +class SnapshotPlugin extends AutoenableMixinProvider implements MixinProvider, BufferConverter, Settings, DeviceProvider { storageSettings = new StorageSettings(this, { debugLogging: { title: 'Debug Logging', @@ -537,11 +538,27 @@ class SnapshotPlugin extends AutoenableMixinProvider implements MixinProvider, B process.nextTick(() => { sdk.deviceManager.onDevicesChanged({ devices: [ + { + name: 'Image Writer', + interfaces: [ + ScryptedInterface.BufferConverter, + ], + type: ScryptedDeviceType.Builtin, + nativeId: ImageWriterNativeId, + } ] }) }) } + async getDevice(nativeId: string): Promise { + if (nativeId === ImageWriterNativeId) + return new ImageWriter(ImageWriterNativeId); + } + + async releaseDevice(id: string, nativeId: string): Promise { + } + getSettings(): Promise { return this.storageSettings.getSettings(); }