/ *
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 , {
default : ( ) => main _default
} ) ;
// src/App.ts
var import _obsidian3 = _ _toModule ( require ( "obsidian" ) ) ;
// src/Modal.ts
var import _obsidian = _ _toModule ( require ( "obsidian" ) ) ;
var CameraModal = class extends import _obsidian . Modal {
constructor ( app2 , cameraSettings ) {
super ( app2 ) ;
this . chosenFolderPath = cameraSettings . chosenFolderPath ;
}
onOpen ( ) {
return _ _async ( this , null , function * ( ) {
const { contentEl } = this ;
const webCamContainer = contentEl . createDiv ( ) ;
const videoEl = webCamContainer . createEl ( "video" ) ;
videoEl . autoplay = true ;
videoEl . muted = true ;
const recordVideoButton = webCamContainer . createEl ( "button" , {
text : "Start recording"
} ) ;
const switchCameraButton = webCamContainer . createEl ( "button" , {
text : "Switch Camera"
} ) ;
const snapPhotoButton = webCamContainer . createEl ( "button" , {
text : "Take a snap"
} ) ;
const filePicker = webCamContainer . createEl ( "input" , {
placeholder : "Choose image file from system" ,
type : "file"
} ) ;
filePicker . accept = "image/*,video/*" ;
filePicker . capture = "camera" ;
const filePicker2 = webCamContainer . createEl ( "input" , {
placeholder : "Choose image file from system" ,
type : "file"
} ) ;
filePicker2 . accept = "image/*" ;
filePicker2 . capture = "camera" ;
const chunks = [ ] ;
let recorder = null ;
let videoStream = null ;
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 ;
}
} ) ;
videoStream = yield getVideoStream ( ) ;
if ( ! videoStream ) {
videoEl . style . display = "none" ;
snapPhotoButton . style . display = "none" ;
recordVideoButton . style . display = "none" ;
switchCameraButton . style . display = "none" ;
filePicker2 . style . display = "block" ;
}
const handleImageSelectChange = ( file ) => _ _async ( this , null , function * ( ) {
const chosenFile = file ;
const bufferFile = yield chosenFile . arrayBuffer ( ) ;
saveFile ( bufferFile , false , chosenFile . name . split ( " " ) . join ( "-" ) ) ;
} ) ;
filePicker . onchange = ( ) => handleImageSelectChange ( filePicker . files [ 0 ] ) ;
filePicker2 . onchange = ( ) => handleImageSelectChange ( filePicker2 . files [ 0 ] ) ;
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 ` ;
}
if ( ! isImage )
new import _obsidian . Notice ( "Adding video to vault..." ) ;
const filePath = this . chosenFolderPath + "/" + fileName ;
const folderExists = app . vault . getAbstractFileByPath ( this . chosenFolderPath ) ;
if ( ! folderExists )
yield app . vault . createFolder ( this . chosenFolderPath ) ;
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);
videoStream && videoStream . getTracks ( ) . forEach ( ( track ) => {
track . stop ( ) ;
} ) ;
this . close ( ) ;
} ) ;
switchCameraButton . onclick = ( ) => _ _async ( this , null , function * ( ) {
cameraIndex = ( cameraIndex + 1 ) % cameras . length ;
videoStream = yield getVideoStream ( ) ;
} ) ;
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" ) ;
} ;
videoEl . srcObject = videoStream ;
recordVideoButton . onclick = ( ) => _ _async ( this , null , function * ( ) {
switchCameraButton . disabled = true ;
let isRecording = recorder && recorder . state === "recording" ;
if ( isRecording )
recorder . stop ( ) ;
isRecording = ! isRecording ;
recordVideoButton . innerText = isRecording ? "Stop Recording" : "Start Recording" ;
if ( ! recorder ) {
recorder = new MediaRecorder ( videoStream , {
mimeType : "video/webm"
} ) ;
}
recorder . ondataavailable = ( e ) => chunks . push ( e . data ) ;
recorder . onstop = ( e ) => _ _async ( this , null , function * ( ) {
const blob = new Blob ( chunks , {
type : "audio/ogg; codecs=opus"
} ) ;
const bufferFile = yield blob . arrayBuffer ( ) ;
saveFile ( bufferFile , false ) ;
} ) ;
recorder . start ( ) ;
} ) ;
} ) ;
}
onClose ( ) {
const { contentEl } = this ;
contentEl . empty ( ) ;
}
} ;
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 * ( ) {
console . log ( "Chosen Folder Path: " + value ) ;
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 ;
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvQXBwLnRzIiwgInNyYy9Nb2RhbC50cyIsICJzcmMvU2V0dGluZ3NUYWIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBPYnNpZGlhbkNhbWVyYSBmcm9tIFwic3JjL0FwcFwiO1xuXG5leHBvcnQgZGVmYXVsdCBPYnNpZGlhbkNhbWVyYSIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBDYW1lcmFNb2RhbCBmcm9tIFwiLi9Nb2RhbFwiO1xuaW1wb3J0IENhbWVyYVNldHRpbmdzVGFiLCB7IERFRkFVTFRfU0VUVElOR1MsIENhbWVyYVBsdWdpblNldHRpbmdzIH0gZnJvbSBcIi4vU2V0dGluZ3NUYWJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JzaWRpYW5DYW1lcmEgZXh0ZW5kcyBQbHVnaW4ge1xuICBzZXR0aW5nczogQ2FtZXJhUGx1Z2luU2V0dGluZ3M7XG4gIGFzeW5jIG9ubG9hZCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuICAgIHRoaXMuYWRkUmliYm9uSWNvbihcImNhbWVyYVwiLCBcIk9ic2lkaWFuIENhbWVyYVwiLCAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBuZXcgQ2FtZXJhTW9kYWwodGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MpLm9wZW4oKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IENhbWVyYVNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6IFwiT3BlbiBjYW1lcmEgbW9kYWxcIixcbiAgICAgIG5hbWU6IFwiT3BlbiBjYW1lcmEgbW9kYWwgLyBGaWxlIFBpY2tlclwiLFxuICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgbmV3IENhbWVyYU1vZGFsKHRoaXMuYXBwLCB0aGlzLnNldHRpbmdzKS5vcGVuKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cblxuICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG4gIH1cblxuICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEFwcCwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nXG5pbXBvcnQgeyBDYW1lcmFQbHVnaW5TZXR0aW5ncyB9IGZyb20gJy4vU2V0dGluZ3NUYWInO1xuXG5jbGFzcyBDYW1lcmFNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgY2hvc2VuRm9sZGVyUGF0aDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgY2FtZXJhU2V0dGluZ3M6IENhbWVyYVBsdWdpblNldHRpbmdzKSB7XG4gICAgc3VwZXIoYXBwKTtcbiAgICB0aGlzLmNob3NlbkZvbGRlclBhdGggPSBjYW1lcmFTZXR0aW5ncy5jaG9zZW5Gb2xkZXJQYXRoXG4gIH1cblxuICBhc3luYyBvbk9wZW4oKSB7XG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG4gICAgY29uc3Qgd2ViQ2FtQ29udGFpbmVyID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xuICAgIC8vIGNvbnN0IHBUZXh0ID0gd2ViQ2FtQ29udGFpbmVyLmNyZWF0ZUVsXG4gICAgLy8gKCdwJywgeyB0ZXh0OiAnZ2V0VmlkZW9TdHJlYW0gbm90IHlldCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuJyB9KTtcbiAgICAvLyBwVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgY29uc3QgdmlkZW9FbCA9IHdlYkNhbUNvbnRhaW5lci5jcmVhdGVFbChcInZpZGVvXCIpO1xuICAgIHZpZGVvRWwuYXV0b3BsYXkgPSB0cnVlO1xuICAgIHZpZGVvRWwubXV0ZWQgPSB0cnVlXG4gICAgY29uc3QgcmVjb3JkVmlkZW9CdXR0b24gPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuICAgICAgdGV4dDogXCJTdGFydCByZWNvcmRpbmdcIixcbiAgICB9KTtcbiAgICBjb25zdCBzd2l0Y2hDYW1lcmFCdXR0b24gPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuICAgICAgdGV4dDogXCJTd2l0Y2ggQ2FtZXJhXCIsXG4gICAgfSk7XG4gICAgY29uc3Qgc25hcFBob3RvQnV0dG9uID0gd2ViQ2FtQ29udGFpbmVyLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHtcbiAgICAgIHRleHQ6IFwiVGFrZSBhIHNuYXBcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbGVQaWNrZXIgPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJpbnB1dFwiLCB7XG4gICAgICBwbGFjZWhvbGRlcjogXCJDaG9vc2UgaW1hZ2UgZmlsZSBmcm9tIHN5c3RlbVwiLFxuICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgfSk7XG4gICAgZmlsZVBpY2tlci5hY2NlcHQgPSBcImltYWdlLyosdmlkZW8vKlwiO1xuICAgIGZpbGVQaWNrZXIuY2FwdHVyZSA9IFwiY2FtZXJhXCI7IC8vIGJhY2sgY2FtZXJhIGJ5IGRlZmF1bHQgZm9yIG1vYmlsZSBzY3JlZW5zXG5cbiAgICBjb25zdCBmaWxlUGlja2VyMiA9IHdlYkNhbUNvbnRhaW5lci5jcmVhdGVFbChcImlucHV0XCIsIHtcbiAgICAgIHBsYWNlaG9sZGVyOiBcIkNob29zZSBpbWFnZSBmaWxlIGZyb20gc3lzdGVtXCIsXG4gICAgICB0eXBlOiBcImZpbGVcIixcbiAgICB9KTtcbiAgICBmaWxlUGlja2VyMi5hY2NlcHQgPSBcImltYWdlLypcIjtcbiAgICBmaWxlUGlja2VyMi5jYXB0dXJlID0gXCJjYW1lcmFcIjsgLy8gYmFjayBjYW1lcmEgYnkgZGVmYXVsdCBmb3IgbW9iaWxlIHNjcmVlbnNcbiAgICAvLyBmaWxlUGlja2VyMi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG5cblxuICAgIGNvbnN0IGNodW5rczogQmxvYlBhcnRbXSA9IFtdO1xuICAgIGxldCByZWNvcmRlcjogTWVkaWFSZWNvcmRlciA9IG51bGw7XG4gICAgbGV0IHZpZGVvU3RyZWFtOiBNZWRpYVN0cmVhbSA9IG51bGw7XG5cbiAgICBjb25zdCBjYW1lcmFzID0gKFxuICAgICAgYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKClcbiAgICApLmZpbHRlcigoZCkgPT4gZC5raW5kID09PSBcInZpZGVvaW5wdXRcIik7XG5cbiAgICBpZiAoY