You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

286 lines
28 KiB

2 years ago
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// main.ts
__export(exports, {
2 years ago
default: () => main_default
2 years ago
});
2 years ago
// src/App.ts
var import_obsidian3 = __toModule(require("obsidian"));
// src/Modal.ts
2 years ago
var import_obsidian = __toModule(require("obsidian"));
var CameraModal = class extends import_obsidian.Modal {
2 years ago
constructor(app2, cameraSettings) {
2 years ago
super(app2);
2 years ago
this.videoStream = null;
2 years ago
this.chosenFolderPath = cameraSettings.chosenFolderPath;
2 years ago
}
onOpen() {
return __async(this, null, function* () {
const { contentEl } = this;
const webCamContainer = contentEl.createDiv();
10 months ago
const statusMsg = webCamContainer.createEl("span", {
text: "Loading.."
});
2 years ago
const videoEl = webCamContainer.createEl("video");
2 years ago
const buttonsDiv = webCamContainer.createDiv();
const firstRow = buttonsDiv.createDiv();
const secondRow = buttonsDiv.createDiv();
const recordVideoButton = firstRow.createEl("button", {
2 years ago
text: "Start recording"
});
2 years ago
const switchCameraButton = firstRow.createEl("button", {
2 years ago
text: "Switch Camera"
});
2 years ago
const snapPhotoButton = firstRow.createEl("button", {
2 years ago
text: "Take a snap"
});
2 years ago
firstRow.style.display = "none";
secondRow.style.display = "none";
const filePicker = secondRow.createEl("input", {
2 years ago
placeholder: "Choose image file from system",
type: "file"
});
10 months ago
filePicker.id = "filepicker";
2 years ago
filePicker.accept = "image/*,video/*";
filePicker.capture = "camera";
10 months ago
filePicker.style.display = "none";
const label = secondRow.createEl("label");
label.textContent = "Upload";
label.style.cursor = "pointer";
label.style.display = "inline-block";
label.style.margin = "5px 0px";
label.style.padding = "5px";
label.style.border = "0.5px solid #555";
label.htmlFor = "filepicker";
label.innerHTML = "⇧ Upload";
label.appendChild(filePicker);
secondRow.appendChild(label);
2 years ago
videoEl.autoplay = true;
videoEl.muted = true;
2 years ago
const chunks = [];
let recorder = null;
2 years ago
this.videoStream = null;
2 years ago
const cameras = (yield navigator.mediaDevices.enumerateDevices()).filter((d) => d.kind === "videoinput");
if (cameras.length <= 1)
switchCameraButton.style.display = "none";
let cameraIndex = 0;
const getVideoStream = () => __async(this, null, function* () {
try {
return yield navigator.mediaDevices.getUserMedia({
video: { deviceId: cameras[cameraIndex].deviceId },
audio: true
});
} catch (error) {
console.log(error);
return null;
}
});
2 years ago
this.videoStream = yield getVideoStream();
if (this.videoStream) {
firstRow.style.display = "block";
secondRow.style.display = "block";
statusMsg.style.display = "none";
} else {
secondRow.style.display = "block";
statusMsg.textContent = "Error in loading videostream in your device..";
2 years ago
}
10 months ago
const handleImageSelectChange = (file, isImage = true) => __async(this, null, function* () {
2 years ago
const chosenFile = file;
const bufferFile = yield chosenFile.arrayBuffer();
10 months ago
saveFile(bufferFile, isImage, chosenFile.name.split(" ").join("-"));
2 years ago
});
10 months ago
filePicker.onchange = () => {
var _a;
if (!((_a = filePicker.files) == null ? void 0 : _a.length))
return;
const selectedFile = filePicker.files[0];
label.textContent = `Selected: ${selectedFile.name}`;
const isImage = selectedFile.type.startsWith("image/");
handleImageSelectChange(selectedFile, isImage);
};
2 years ago
const view = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
const saveFile = (file, isImage = false, fileName = "") => __async(this, null, function* () {
if (!fileName) {
const dateString = (new Date() + "").slice(4, 28).split(" ").join("_").split(":").join("-");
fileName = isImage ? `image_${dateString}.png` : `video_${dateString}.webm`;
}
10 months ago
new import_obsidian.Notice(`Adding new ${isImage ? "Image" : "Video"} to vault...`);
2 years ago
const filePath = this.chosenFolderPath + "/" + fileName;
const folderExists = app.vault.getAbstractFileByPath(this.chosenFolderPath);
2 years ago
if (!folderExists)
2 years ago
yield app.vault.createFolder(this.chosenFolderPath);
2 years ago
const fileExists = app.vault.getAbstractFileByPath(filePath);
if (!fileExists)
yield app.vault.createBinary(filePath, file);
if (!view)
return new import_obsidian.Notice(`Saved to ${filePath}`);
const cursor = view.editor.getCursor();
view.editor.replaceRange(isImage ? `![${fileName}](${filePath})
` : `
![[${filePath}]]
`, cursor);
this.close();
});
switchCameraButton.onclick = () => __async(this, null, function* () {
cameraIndex = (cameraIndex + 1) % cameras.length;
10 months ago
this.videoStream = yield navigator.mediaDevices.getUserMedia({
video: { deviceId: cameras[cameraIndex].deviceId },
audio: true
});
videoEl.srcObject = this.videoStream;
videoEl.play();
2 years ago
});
snapPhotoButton.onclick = () => {
const canvas = webCamContainer.createEl("canvas");
canvas.style.display = "none";
const { videoHeight, videoWidth } = videoEl;
canvas.height = videoHeight;
canvas.width = videoWidth;
canvas.getContext("2d").drawImage(videoEl, 0, 0, videoWidth, videoHeight);
canvas.toBlob((blob) => __async(this, null, function* () {
const bufferFile = yield blob.arrayBuffer();
saveFile(bufferFile, true);
}), "image/png");
};
2 years ago
videoEl.srcObject = this.videoStream;
2 years ago
recordVideoButton.onclick = () => __async(this, null, function* () {
switchCameraButton.disabled = true;
if (!recorder) {
2 years ago
recorder = new MediaRecorder(this.videoStream, {
2 years ago
mimeType: "video/webm"
});
}
10 months ago
let isRecording = recorder && recorder.state === "recording";
if (isRecording) {
recorder.stop();
} else {
recorder.start();
}
isRecording = !isRecording;
recordVideoButton.innerText = isRecording ? "Stop Recording" : "Start Recording";
2 years ago
recorder.ondataavailable = (e) => chunks.push(e.data);
2 years ago
recorder.onstop = (_) => __async(this, null, function* () {
2 years ago
const blob = new Blob(chunks, {
type: "audio/ogg; codecs=opus"
});
const bufferFile = yield blob.arrayBuffer();
saveFile(bufferFile, false);
});
});
});
}
onClose() {
2 years ago
var _a;
2 years ago
const { contentEl } = this;
2 years ago
(_a = this.videoStream) == null ? void 0 : _a.getTracks().forEach((track) => {
track.stop();
});
2 years ago
contentEl.empty();
}
};
2 years ago
var Modal_default = CameraModal;
// src/SettingsTab.ts
var import_obsidian2 = __toModule(require("obsidian"));
var DEFAULT_SETTINGS = {
chosenFolderPath: "attachments/snaps"
};
var CameraSettingsTab = class extends import_obsidian2.PluginSettingTab {
constructor(app2, plugin) {
super(app2, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: "Obsidian-Camera settings" });
new import_obsidian2.Setting(containerEl).setName("Folder Path").setDesc("Folder where the videos and snaps should be saved").addText((text) => text.setPlaceholder("Enter your secret").setValue(this.plugin.settings.chosenFolderPath).onChange((value) => __async(this, null, function* () {
this.plugin.settings.chosenFolderPath = value;
yield this.plugin.saveSettings();
})));
}
};
// src/App.ts
var ObsidianCamera = class extends import_obsidian3.Plugin {
onload() {
return __async(this, null, function* () {
yield this.loadSettings();
this.addRibbonIcon("camera", "Obsidian Camera", (evt) => {
new Modal_default(this.app, this.settings).open();
});
this.addSettingTab(new CameraSettingsTab(this.app, this));
this.addCommand({
id: "Open camera modal",
name: "Open camera modal / File Picker",
callback: () => {
new Modal_default(this.app, this.settings).open();
}
});
});
}
loadSettings() {
return __async(this, null, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.saveData(this.settings);
});
}
};
// main.ts
var main_default = ObsidianCamera;
10 months ago
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvQXBwLnRzIiwgInNyYy9Nb2RhbC50cyIsICJzcmMvU2V0dGluZ3NUYWIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBPYnNpZGlhbkNhbWVyYSBmcm9tIFwic3JjL0FwcFwiO1xuXG5leHBvcnQgZGVmYXVsdCBPYnNpZGlhbkNhbWVyYSIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBDYW1lcmFNb2RhbCBmcm9tIFwiLi9Nb2RhbFwiO1xuaW1wb3J0IENhbWVyYVNldHRpbmdzVGFiLCB7IERFRkFVTFRfU0VUVElOR1MsIENhbWVyYVBsdWdpblNldHRpbmdzIH0gZnJvbSBcIi4vU2V0dGluZ3NUYWJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JzaWRpYW5DYW1lcmEgZXh0ZW5kcyBQbHVnaW4ge1xuICBzZXR0aW5nczogQ2FtZXJhUGx1Z2luU2V0dGluZ3M7XG4gIGFzeW5jIG9ubG9hZCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuICAgIHRoaXMuYWRkUmliYm9uSWNvbihcImNhbWVyYVwiLCBcIk9ic2lkaWFuIENhbWVyYVwiLCAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBuZXcgQ2FtZXJhTW9kYWwodGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MpLm9wZW4oKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IENhbWVyYVNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6IFwiT3BlbiBjYW1lcmEgbW9kYWxcIixcbiAgICAgIG5hbWU6IFwiT3BlbiBjYW1lcmEgbW9kYWwgLyBGaWxlIFBpY2tlclwiLFxuICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgbmV3IENhbWVyYU1vZGFsKHRoaXMuYXBwLCB0aGlzLnNldHRpbmdzKS5vcGVuKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cblxuICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG4gIH1cblxuICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEFwcCwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBDYW1lcmFQbHVnaW5TZXR0aW5ncyB9IGZyb20gXCIuL1NldHRpbmdzVGFiXCI7XG5cbmNsYXNzIENhbWVyYU1vZGFsIGV4dGVuZHMgTW9kYWwge1xuXHRjaG9zZW5Gb2xkZXJQYXRoOiBzdHJpbmc7XG5cdHZpZGVvU3RyZWFtOiBNZWRpYVN0cmVhbSA9IG51bGw7XG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBjYW1lcmFTZXR0aW5nczogQ2FtZXJhUGx1Z2luU2V0dGluZ3MpIHtcblx0XHRzdXBlcihhcHApO1xuXHRcdHRoaXMuY2hvc2VuRm9sZGVyUGF0aCA9IGNhbWVyYVNldHRpbmdzLmNob3NlbkZvbGRlclBhdGg7XG5cdH1cblxuXHRhc3luYyBvbk9wZW4oKSB7XG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cdFx0Y29uc3Qgd2ViQ2FtQ29udGFpbmVyID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xuXG5cdFx0Y29uc3Qgc3RhdHVzTXNnID0gd2ViQ2FtQ29udGFpbmVyLmNyZWF0ZUVsKFwic3BhblwiLCB7XG5cdFx0XHR0ZXh0OiBcIkxvYWRpbmcuLlwiLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHZpZGVvRWwgPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJ2aWRlb1wiKTtcblx0XHRjb25zdCBidXR0b25zRGl2ID0gd2ViQ2FtQ29udGFpbmVyLmNyZWF0ZURpdigpO1xuXHRcdGNvbnN0IGZpcnN0Um93ID0gYnV0dG9uc0Rpdi5jcmVhdGVEaXYoKTtcblx0XHRjb25zdCBzZWNvbmRSb3cgPSBidXR0b25zRGl2LmNyZWF0ZURpdigpO1xuXHRcdGNvbnN0IHJlY29yZFZpZGVvQnV0dG9uID0gZmlyc3RSb3cuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuXHRcdFx0dGV4dDogXCJTdGFydCByZWNvcmRpbmdcIixcblx0XHR9KTtcblx0XHRjb25zdCBzd2l0Y2hDYW1lcmFCdXR0b24gPSBmaXJzdFJvdy5jcmVhdGVFbChcImJ1dHRvblwiLCB7XG5cdFx0XHR0ZXh0OiBcIlN3aXRjaCBDYW1lcmFcIixcblx0XHR9KTtcblx0XHRjb25zdCBzbmFwUGhvdG9CdXR0b24gPSBmaXJzdFJvdy5jcmVhdGVFbChcImJ1dHRvblwiLCB7XG5cdFx0XHR0ZXh0OiBcIlRha2UgYSBzbmFwXCIsXG5cdFx0fSk7XG5cdFx0Zmlyc3RSb3cuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdHNlY29uZFJvdy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cblx0XHRjb25zdCBmaWxlUGlja2VyID0gc2Vjb25kUm93LmNyZWF0ZUVsKFwiaW5wdXRcIiwge1xuXHRcdFx0cGxhY2Vob2xkZXI6IFwiQ2hvb3NlIGltYWdlIGZpbGUgZnJvbSBzeXN0ZW1cIixcblx0XHRcdHR5cGU6IFwiZmlsZVwiLFxuXHRcdH0pO1xuXHRcdGZpbGVQaWNrZXIuaWQgPSBcImZpbGVwaWNrZXJcIjtcblx0XHRmaWxlUGlja2VyLmFjY2VwdCA9IFwiaW1hZ2UvKix2aWRlby8qXCI7XG5cdFx0ZmlsZVBpY2tlci5jYXB0dXJlID0gXCJjYW1lcmFcIjsgLy8gYmFjayBjYW1lcmEgYnkgZGVmYXVsdCBmb3IgbW9iaWxlIHNjcmVlbnNcblxuXHRcdGZpbGVQaWNrZXIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG5cdFx0Y29uc3QgbGFiZWwgPSBzZWNvbmRSb3cuY3JlYXRlRWwoXCJsYWJlbFwiKTtcblx0XHRsYWJlbC50ZXh0Q29udGVudCA9IFwiVXBsb2FkXCI7XG5cdFx0bGFiZWwuc3R5bGUuY3Vyc29yID0gXCJwb2ludGVyXCI7XG5cdFx0bGFiZWwuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG5cdFx0bGFiZWwuc3R5bGUubWFyZ2luID0gXCI1cHggMHB4XCI7XG5cdFx0bGFiZWwuc3R5bGUucGFkZGluZyA9IFwiNXB4XCI7XG5cdFx0bGFiZWwuc3R5bGUuYm9yZGVyID0gXCIwLjVweCBzb2xpZCAjNTU1XCI7XG5cdFx0bGFiZWwuaHRtbEZvciA9IFwiZmlsZXBpY2tlclwiO1xuXHRcdGxhYmVsLmlubmVySFRNTCA9IFwiJiM4Njc5OyBVcGxvYWRcIjtcb