« get me outta code hell

Metadata (in memory) - 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:
authorFlorrie <towerofnix@gmail.com>2019-02-25 11:27:11 -0400
committerFlorrie <towerofnix@gmail.com>2019-02-25 11:27:11 -0400
commit75251bb2309505c20dc7500117a17649d41412d8 (patch)
tree97c646cb2ccb224a456147aaec8c4a5854990bb5 /metadata-readers.js
parent4eee44f7d92dcdf2c8bccea78723ba0b194eb2d7 (diff)
Metadata (in memory)
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