« get me outta code hell

mtui - Music Text User Interface - user-friendly command line music player
about summary refs log tree commit diff
path: root/metadata-readers.js
diff options
context:
space:
mode:
Diffstat (limited to 'metadata-readers.js')
-rw-r--r--metadata-readers.js46
1 files changed, 46 insertions, 0 deletions
diff --git a/metadata-readers.js b/metadata-readers.js
new file mode 100644
index 0000000..1e6eb1b
--- /dev/null
+++ b/metadata-readers.js
@@ -0,0 +1,46 @@
+const { promisifyProcess } = require('./general-util')
+const { spawn } = require('child_process')
+
+const metadataReaders = {
+  ffprobe: async filePath => {
+    const ffprobe = spawn('ffprobe', [
+      '-print_format', 'json',
+      '-show_entries', 'stream=codec_name:format',
+      '-select_streams', 'a:0',
+      '-v', 'quiet',
+      filePath
+    ])
+
+    let probeDataString = ''
+
+    ffprobe.stdout.on('data', data => {
+      probeDataString += data
+    })
+
+    await promisifyProcess(ffprobe, false)
+
+    let data
+
+    try {
+      data = JSON.parse(probeDataString)
+    } catch (error) {
+      return null
+    }
+
+    if (typeof data !== 'object' || typeof data.format !== 'object') {
+      return null
+    }
+
+    return {
+      duration: parseFloat(data.format.duration),
+      fileSize: parseInt(data.format.size),
+      bitrate: parseInt(data.format.bit_rate)
+    }
+  },
+
+  getMetadataReaderFor: arg => {
+    return metadataReaders.ffprobe
+  }
+}
+
+module.exports = metadataReaders