diff --git a/hq2cd-conv/.idea/.gitignore b/hq2cd-conv/.idea/.gitignore
new file mode 100644
index 0000000..1c2fda5
--- /dev/null
+++ b/hq2cd-conv/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/hq2cd-conv/.idea/discord.xml b/hq2cd-conv/.idea/discord.xml
new file mode 100644
index 0000000..30bab2a
--- /dev/null
+++ b/hq2cd-conv/.idea/discord.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/hq2cd-conv/.idea/encodings.xml b/hq2cd-conv/.idea/encodings.xml
new file mode 100644
index 0000000..c810f2c
--- /dev/null
+++ b/hq2cd-conv/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/hq2cd-conv/.idea/hq2cd-conv.iml b/hq2cd-conv/.idea/hq2cd-conv.iml
new file mode 100644
index 0000000..d9e6024
--- /dev/null
+++ b/hq2cd-conv/.idea/hq2cd-conv.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/hq2cd-conv/.idea/inspectionProfiles/profiles_settings.xml b/hq2cd-conv/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/hq2cd-conv/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/hq2cd-conv/.idea/misc.xml b/hq2cd-conv/.idea/misc.xml
new file mode 100644
index 0000000..84ee0ed
--- /dev/null
+++ b/hq2cd-conv/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/hq2cd-conv/.idea/modules.xml b/hq2cd-conv/.idea/modules.xml
new file mode 100644
index 0000000..5708f41
--- /dev/null
+++ b/hq2cd-conv/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/hq2cd-conv/albums.txt b/hq2cd-conv/albums.txt
new file mode 100644
index 0000000..e236bfb
--- /dev/null
+++ b/hq2cd-conv/albums.txt
@@ -0,0 +1 @@
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller
diff --git a/hq2cd-conv/filtered_files.txt b/hq2cd-conv/filtered_files.txt
new file mode 100644
index 0000000..526fba3
--- /dev/null
+++ b/hq2cd-conv/filtered_files.txt
@@ -0,0 +1,9 @@
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller\01 - Wanna Be Startin’ Somethin’.flac
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller\02 - Baby Be Mine.flac
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller\03 - The Girl Is Mine.flac
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller\04 - Thriller.flac
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller\05 - Beat It.flac
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller\06 - Billie Jean.flac
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller\07 - Human Nature.flac
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller\08 - P.Y.T. (Pretty Young Thing).flac
+C:\Users\Isaac\Documents\Development\hq2cd-conv\Thriller\09 - The Lady in My Life.flac
diff --git a/hq2cd-conv/gethq.py b/hq2cd-conv/gethq.py
new file mode 100644
index 0000000..b5fedd7
--- /dev/null
+++ b/hq2cd-conv/gethq.py
@@ -0,0 +1,61 @@
+import json
+import os
+import subprocess
+
+
+def _ffprobe(file_path):
+ command = (
+ 'ffprobe -v quiet -print_format json -show_streams -select_streams a "'f'{file_path}"'
+ )
+ result = subprocess.run(command, capture_output=True)
+ if result.returncode == 0:
+ return json.loads(result.stdout)
+ raise RuntimeError(
+ f'FFProbe failed for {file_path}, output: {result.stderr}'
+ )
+
+def scan_dir():
+ flac_files = []
+ for root, dirs, files in os.walk(os.getcwd()):
+ for file in files:
+ if file.endswith(".flac"):
+ flac_files.append(os.path.join(root, file))
+ return flac_files
+
+def filter_files(flac_files):
+ filtered_files = []
+ counter = 0
+ max_counter = len(flac_files)
+ for file in flac_files:
+ counter += 1
+ print("Progress: " + str(counter) + "/" + str(max_counter))
+ metadata = _ffprobe(file)
+ if int(metadata['streams'][0]['bits_per_raw_sample']) > 16 and int(
+ metadata['streams'][0]['sample_rate']) > 44100:
+ filtered_files.append(file)
+ return filtered_files
+def print_files(filtered_files):
+ for file in filtered_files:
+ print(file)
+
+def get_albums(filtered_files):
+ albums = []
+ for file in filtered_files:
+ album = os.path.dirname(file)
+ if album not in albums:
+ albums.append(album)
+ return albums
+
+flac_files = scan_dir()
+filtered_files = filter_files(flac_files)
+albums = get_albums(filtered_files)
+print_files(albums)
+
+print_files(filtered_files)
+with open("filtered_files.txt", "w") as f:
+ for file in filtered_files:
+ f.write(file + "\n")
+
+with open("albums.txt", "w") as f:
+ for album in albums:
+ f.write(album + "\n")
\ No newline at end of file
diff --git a/hq2cd-conv/hq2cd.py b/hq2cd-conv/hq2cd.py
new file mode 100644
index 0000000..18bf7d0
--- /dev/null
+++ b/hq2cd-conv/hq2cd.py
@@ -0,0 +1,78 @@
+# Recursivly scan from the currenct directory and add every flac file to an array
+
+import os
+
+import json
+import subprocess
+import ffmpeg
+
+# TODO: Rewrite using ffmpeg-python probe functionality
+def _ffprobe(file_path):
+ command = (
+ 'ffprobe -v quiet -print_format json -show_streams -select_streams a "'f'{file_path}"'
+ )
+ result = subprocess.run(command, capture_output=True)
+ if result.returncode == 0:
+ return json.loads(result.stdout)
+ raise RuntimeError(
+ f'FFProbe failed for {file_path}, output: {result.stderr}'
+ )
+
+def scan_dir():
+ flac_files = []
+ for root, dirs, files in os.walk(os.getcwd()):
+ for file in files:
+ if file.endswith(".flac"):
+ flac_files.append(os.path.join(root, file))
+ return flac_files
+
+
+# Filter the array of flac files to only include files with a bit depth higher than 16, and a sample rate higher than 44.1kHz
+def filter_files(flac_files):
+ filtered_files = []
+ counter = 0
+ max_counter = len(flac_files)
+ for file in flac_files:
+ counter += 1
+ print("Progress: " + str(counter) + "/" + str(max_counter))
+ metadata = _ffprobe(file)
+ if int(metadata['streams'][0]['bits_per_raw_sample']) > 16 and int(
+ metadata['streams'][0]['sample_rate']) > 44100:
+ filtered_files.append(file)
+ return filtered_files
+
+
+# Print the filtered files to the console
+
+def print_files(filtered_files):
+ for file in filtered_files:
+ print(file)
+
+
+def get_relative_path(file):
+ return os.path.relpath(file, os.getcwd())
+
+def get_root_path(file):
+ return os.path.dirname(file)
+
+
+def convert_files(filtered_files):
+ for file in filtered_files:
+ output = ".\\Output\\" + get_relative_path(file)
+
+ output_no_basename = os.path.dirname(output)
+ os.makedirs(output_no_basename, exist_ok=True)
+
+ stream = ffmpeg.input(file)
+ stream = ffmpeg.output(stream, output, sample_fmt="s16", ar='44100')
+ stream = ffmpeg.overwrite_output(stream)
+ ffmpeg.run(stream)
+
+# Run the functions
+
+flac_files = scan_dir()
+print_files(flac_files)
+filtered_files = filter_files(flac_files)
+print_files(filtered_files)
+convert_files(filtered_files)
+
diff --git a/hq2cd-conv/poetry.lock b/hq2cd-conv/poetry.lock
new file mode 100644
index 0000000..2f124d4
--- /dev/null
+++ b/hq2cd-conv/poetry.lock
@@ -0,0 +1,151 @@
+# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
+
+[[package]]
+name = "ffmpeg-python"
+version = "0.2.0"
+description = "Python bindings for FFmpeg - with complex filtering support"
+optional = false
+python-versions = "*"
+files = [
+ {file = "ffmpeg-python-0.2.0.tar.gz", hash = "sha256:65225db34627c578ef0e11c8b1eb528bb35e024752f6f10b78c011f6f64c4127"},
+ {file = "ffmpeg_python-0.2.0-py3-none-any.whl", hash = "sha256:ac441a0404e053f8b6a1113a77c0f452f1cfc62f6344a769475ffdc0f56c23c5"},
+]
+
+[package.dependencies]
+future = "*"
+
+[package.extras]
+dev = ["Sphinx (==2.1.0)", "future (==0.17.1)", "numpy (==1.16.4)", "pytest (==4.6.1)", "pytest-mock (==1.10.4)", "tox (==3.12.1)"]
+
+[[package]]
+name = "ffprobe-python"
+version = "1.0.3"
+description = " A wrapper around ffprobe command to extract metadata from media files."
+optional = false
+python-versions = "*"
+files = [
+ {file = "ffprobe-python-1.0.3.tar.gz", hash = "sha256:b1d3e69e65e0814e28575f63a47b836a0b7cc8f1ffedd62d27152d9e4488214a"},
+ {file = "ffprobe_python-1.0.3-py3-none-any.whl", hash = "sha256:b02576228f6da0b0bb973e15e5dadb132013a4ded202dabb89ac77779e9634d6"},
+]
+
+[[package]]
+name = "future"
+version = "0.18.3"
+description = "Clean single-source support for Python 3 and 2"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+files = [
+ {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"},
+]
+
+[[package]]
+name = "llvmlite"
+version = "0.40.0"
+description = "lightweight wrapper around basic LLVM functionality"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "llvmlite-0.40.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a46db1ed219d93ef05245ec17cf243074ec2b2687209cb310a803a2c2510dc"},
+ {file = "llvmlite-0.40.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b9d742b66023298532d0e7beddd3d9f04334c046df7a02a1ec2ba8b4046a978c"},
+ {file = "llvmlite-0.40.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ff38c309dc758b996d556e599e00647e6b8dbd21125c06b2d0584a9984a2288"},
+ {file = "llvmlite-0.40.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ecb8cdee35bbbdad9b331f446641977645de1973f6270bf4194307a1753666"},
+ {file = "llvmlite-0.40.0-cp310-cp310-win32.whl", hash = "sha256:83dd5148f6ddd4d35585b69ebaa50605fdf8011a5b7259a0463afd4aefc62414"},
+ {file = "llvmlite-0.40.0-cp310-cp310-win_amd64.whl", hash = "sha256:f72d6ccbfd9cc7da43098fcef23ffbe173ce2d986215072dbb2e7929412f9ff8"},
+ {file = "llvmlite-0.40.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbf19077144e159406ef222348d5330d5061177fb79d3f7f82abf2cf29b77c0b"},
+ {file = "llvmlite-0.40.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4732d6c981f658f014dd2ab2b682ac631cd12a6695e77c2d460cc68dc767868"},
+ {file = "llvmlite-0.40.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2754c4d2b6f027ab45425abd94dee4cbd228b598531b1e9e1fc15f3298265d88"},
+ {file = "llvmlite-0.40.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb79b992bdc2e62c5f5f86263d5546b5298d498e7c1a9d64b3a6f0d31f46ba5b"},
+ {file = "llvmlite-0.40.0-cp311-cp311-win_amd64.whl", hash = "sha256:be0ff5b68a86e47a7ec6cd5389bb17b4b8f020b981628c9e714dc2cfdbe89c86"},
+ {file = "llvmlite-0.40.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f5d4445eccd9c9c5639b35cb6279231f97cbd77a1c49fb41c05081ff96e041db"},
+ {file = "llvmlite-0.40.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:060f00611d8e65d6db80cabba17fbefde9ebefbfb6937fe5677f06cd3e7bbe3c"},
+ {file = "llvmlite-0.40.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58f5ba5febb2372418a3d37bd76d51bb987276a6fd979c2f2772b60b9061e575"},
+ {file = "llvmlite-0.40.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d1622237e6ce543ac185751f782c7e10cabe45abf2de802cd5dca8023805a5c"},
+ {file = "llvmlite-0.40.0-cp38-cp38-win32.whl", hash = "sha256:06803a1a38f911576bbe63a4082334d6661c59f2080e4681de1c66ec4924b0ac"},
+ {file = "llvmlite-0.40.0-cp38-cp38-win_amd64.whl", hash = "sha256:87c2114567f95c715ae35b03d82caa0df66a978c93a1ff752964949e9ce596d5"},
+ {file = "llvmlite-0.40.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a3382d81fcda57f5502f45a9ca62e0c9103fabd5f817c9820c7e61b9375f3d7"},
+ {file = "llvmlite-0.40.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:260b0241c17a1ec585020e1df58ed30b9975c3573c619fa1724ceb4cd53cbe42"},
+ {file = "llvmlite-0.40.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f980992b6c9dfee20a1608c5a4d875f8a52d76353ca02470550a85be6e5d3680"},
+ {file = "llvmlite-0.40.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52eee9e245ef6eb911d6c2a3a1a66378745a40c637284386031b0915754f457e"},
+ {file = "llvmlite-0.40.0-cp39-cp39-win32.whl", hash = "sha256:d27c2ec699b820296659dfd36ead1c527eb190c6d5cb3de24bfbee1024bdc20a"},
+ {file = "llvmlite-0.40.0-cp39-cp39-win_amd64.whl", hash = "sha256:6cf84141d1793c69285b88acf4216370cb831eab99778546a2a9002fadac932d"},
+ {file = "llvmlite-0.40.0.tar.gz", hash = "sha256:c910b8fbfd67b8e9d0b10ebc012b23cd67cbecef1b96f00d391ddd298d71671c"},
+]
+
+[[package]]
+name = "numba"
+version = "0.57.0"
+description = "compiling Python code using LLVM"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "numba-0.57.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e2c14c411545e80bf0f1a33232fb0bd6aa3368f86e56eeffc7f6d3ac16ea3fd"},
+ {file = "numba-0.57.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b3382c56d805ffcdc7b46eb69a906be733dd35b84be14abba8e5fd27d7916b2"},
+ {file = "numba-0.57.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:133cba9b5002bf67f6f73d9b3050d919c1be91326bbdcccfdf3259bcfb1cec0e"},
+ {file = "numba-0.57.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d92a17ee849574665c5d94e9c9b862e469e1231d3dbb9e58e58b30b4bb0cbce9"},
+ {file = "numba-0.57.0-cp310-cp310-win32.whl", hash = "sha256:abc90c3d303a67ae5194770a6f0d0a83edf076683b8a426349a27b91d98e00d1"},
+ {file = "numba-0.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:430f43c96f866ca4fe6008d8aa28bb608911d908ff94f879e0dbad7768ef9869"},
+ {file = "numba-0.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:069f7d8fddad4c0eb1d7534c2a18098fe50473dc77832b409176002e9011b96f"},
+ {file = "numba-0.57.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:79daa130fc9e4ebd1eea0a594d1de86d8a4366989f5fab93c482246b502520db"},
+ {file = "numba-0.57.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:274f4db4814ebd5ec81697acfc36df04a865b86610d7714905185b753f3f9baf"},
+ {file = "numba-0.57.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0106ee441e3f69cc6f17cb470c4fcccd592e0606567d43245635d72b071ab88e"},
+ {file = "numba-0.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5d31b4d95000d86ffa9652ab5bcfa0ea30e6c3fc40e610147d4f2f00116703d"},
+ {file = "numba-0.57.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e0b8de39bf17519435937b53276dfb02e2eb8bc27cd211c8eeb01ffed1cab6b"},
+ {file = "numba-0.57.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:18d90fa6fcd5b796999392a8ea67f2fbccecf8dabcea726e2e721c79f40566a6"},
+ {file = "numba-0.57.0-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4f62528c7c8c5f97e9689fd788e420b68c67ee0a1a9a7715a57fd584b7aef1e"},
+ {file = "numba-0.57.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fd12cf0b431676c08057685e229ea5daaa1ec8efba2506c38671734ace49c2d7"},
+ {file = "numba-0.57.0-cp38-cp38-win32.whl", hash = "sha256:e5f11b1d435fb4d1d1b68fa68ff456d632dc4bfd40b18825ff80d6081d1afb26"},
+ {file = "numba-0.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:5810ed2d6d22eb3c48bedfac2187fc44bb90e05f02d47fd31059e69207ae4106"},
+ {file = "numba-0.57.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eddba74493d4003a42cd61ff7feca4928a94a45553d1fddac77a5cc339f6f4f9"},
+ {file = "numba-0.57.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:110be5e1213d0a3d5fc691e921a000779500620196d99cee9908fce83d1e48df"},
+ {file = "numba-0.57.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f949018ab9c467d38f14fe17db4df0d4a1c664be802189e2d6c5a434d9ffd4f6"},
+ {file = "numba-0.57.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9fc0cd4ec93a1e3877985e10ed5837ed2991c83aa4b7ca574caae5c8b448cc4b"},
+ {file = "numba-0.57.0-cp39-cp39-win32.whl", hash = "sha256:83d4f21c98eed3001e9896a43a1ce9c825999c03f7eb39ddd1c2d07a76708392"},
+ {file = "numba-0.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:9173d00c6753212b68e4fd319cfa96c21b2263949452c97b034e78ce09539dee"},
+ {file = "numba-0.57.0.tar.gz", hash = "sha256:2af6d81067a5bdc13960c6d2519dbabbf4d5d597cf75d640c5aeaefd48c6420a"},
+]
+
+[package.dependencies]
+llvmlite = "==0.40.*"
+numpy = ">=1.21,<1.25"
+
+[[package]]
+name = "numpy"
+version = "1.24.3"
+description = "Fundamental package for array computing in Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"},
+ {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"},
+ {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"},
+ {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"},
+ {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"},
+ {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"},
+ {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"},
+ {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"},
+ {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"},
+ {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"},
+ {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"},
+ {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"},
+ {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"},
+ {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"},
+ {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"},
+ {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"},
+ {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"},
+ {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"},
+ {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"},
+ {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"},
+ {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"},
+ {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"},
+ {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"},
+ {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"},
+ {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"},
+ {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"},
+ {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"},
+ {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"},
+]
+
+[metadata]
+lock-version = "2.0"
+python-versions = "^3.11"
+content-hash = "fd5cf3d70b85e0381cfa9c3c45544d5016a7f58b100057f4be2bb378e583455b"
diff --git a/hq2cd-conv/pyproject.toml b/hq2cd-conv/pyproject.toml
new file mode 100644
index 0000000..fe9c918
--- /dev/null
+++ b/hq2cd-conv/pyproject.toml
@@ -0,0 +1,18 @@
+[tool.poetry]
+name = "hq2cd-conv"
+version = "0.1.0"
+description = ""
+authors = ["Isaac Shoebottom "]
+readme = "README.md"
+packages = [{include = "hq2cd_conv"}]
+
+[tool.poetry.dependencies]
+python = "^3.11"
+ffprobe-python = "^1.0.3"
+ffmpeg-python = "^0.2.0"
+numba = "^0.57.0"
+
+
+[build-system]
+requires = ["poetry-core"]
+build-backend = "poetry.core.masonry.api"
diff --git a/hq2cd-conv/test.json b/hq2cd-conv/test.json
new file mode 100644
index 0000000..51f3aff
--- /dev/null
+++ b/hq2cd-conv/test.json
@@ -0,0 +1 @@
+{"streams": [{"index": 0, "codec_name": "flac", "codec_long_name": "FLAC (Free Lossless Audio Codec)", "codec_type": "audio", "codec_tag_string": "[0][0][0][0]", "codec_tag": "0x0000", "sample_fmt": "s16", "sample_rate": "44100", "channels": 2, "channel_layout": "stereo", "bits_per_sample": 0, "initial_padding": 0, "r_frame_rate": "0/0", "avg_frame_rate": "0/0", "time_base": "1/44100", "start_pts": 0, "start_time": "0.000000", "duration_ts": 16186608, "duration": "367.043265", "bits_per_raw_sample": "16", "extradata_size": 34, "disposition": {"default": 0, "dub": 0, "original": 0, "comment": 0, "lyrics": 0, "karaoke": 0, "forced": 0, "hearing_impaired": 0, "visual_impaired": 0, "clean_effects": 0, "attached_pic": 0, "timed_thumbnails": 0, "captions": 0, "descriptions": 0, "metadata": 0, "dependent": 0, "still_image": 0}}, {"index": 1, "codec_name": "mjpeg", "codec_long_name": "Motion JPEG", "profile": "Baseline", "codec_type": "video", "codec_tag_string": "[0][0][0][0]", "codec_tag": "0x0000", "width": 1200, "height": 1200, "coded_width": 1200, "coded_height": 1200, "closed_captions": 0, "film_grain": 0, "has_b_frames": 0, "sample_aspect_ratio": "1:1", "display_aspect_ratio": "1:1", "pix_fmt": "yuvj420p", "level": -99, "color_range": "pc", "color_space": "bt470bg", "chroma_location": "center", "refs": 1, "r_frame_rate": "90000/1", "avg_frame_rate": "0/0", "time_base": "1/90000", "start_pts": 0, "start_time": "0.000000", "duration_ts": 33033894, "duration": "367.043267", "bits_per_raw_sample": "8", "disposition": {"default": 0, "dub": 0, "original": 0, "comment": 0, "lyrics": 0, "karaoke": 0, "forced": 0, "hearing_impaired": 0, "visual_impaired": 0, "clean_effects": 0, "attached_pic": 1, "timed_thumbnails": 0, "captions": 0, "descriptions": 0, "metadata": 0, "dependent": 0, "still_image": 0}, "tags": {"comment": "Cover (front)"}}], "format": {"filename": "C:\\Users\\Isaac\\Documents\\Development\\hq2cd-conv\\Spirit Phone\\01 - Lifetime Achievement Award.flac", "nb_streams": 2, "nb_programs": 0, "format_name": "flac", "format_long_name": "raw FLAC", "start_time": "0.000000", "duration": "367.043265", "size": "43271989", "bit_rate": "943147", "probe_score": 100, "tags": {"ARTISTSORT": "Lemon Demon", "MUSICBRAINZ_RELEASEGROUPID": "51202ca2-c319-4f0f-9ac0-7a0799c1e138", "ORIGINALYEAR": "2016", "UNSYNCEDLYRICS": "Die hard fans adored your hands\r\nThey loved your throat and quote unquote \"you\"\r\nHey, remember Michael Jackson. Michael Jackson really happened\r\nDelta Echo Alpha Delta, walking on the moon forever\r\n\r\nYou are dead and buried, you are dead (Oh no)\r\nThat's being revised!\r\nEven as we speak we're synthesizing blood and organs\r\nSynthesizing heart and soul\r\nEven Katy Perry knows you're dead (Oh no)\r\nWon't she be surprised!\r\nWhen we get your heart to start tomorrow\r\nWhen you see the chart tomorrow you'll be number one\r\n\r\nBro, you look amazing\r\nReally put together\r\nIt's like you haven't aged a day, oh\r\nIt's like we know what we're doing or something\r\n\r\nYou've been gone for way too long, like half a year\r\nAn entire career for some\r\nGood luck getting into Heaven if you live past 27\r\nListen to the radiation put you back in circulation\r\n\r\nYou are dead and buried, you are dead (Oh no)\r\nOh, but you never died!\r\nEven as we speak we're synthesizing blood and organs\r\nSynthesizing heart and soul\r\nAin't no cemetary you can't shed (Oh no)\r\nAin't nowhere you can hide!\r\nDon't be frightened of us\r\nSoon enough you're gonna love us, just remember\r\n\r\nThis is your last ride ever, forever\r\nFill up your lungs, feel better\r\nLook, it's you, good as new\r\nNew hands, new throat, new living tissue\r\nYou earned this new purpose\r\nLifetime achievement award\r\n\r\nDon't be nervous baby\r\nWe put a billion eyes back on you\r\nFrom the grave to the stage\r\nYou're a natural, babe!\r\n\r\nYou are dead and buried, you are dead (Oh no)\r\nThat's being revised!\r\nEven as we speak we're synthesizing blood and organs\r\nSynthesizing heart and soul\r\nEven Katy Perry knows you're dead (Oh no)\r\nWon't she be surprised!\r\nWhen we get your heart to start tomorrow\r\nWhen you see the chart tomorrow you'll be number one\r\n(Oh no, oh no)", "TITLE": "Lifetime Achievement Award", "ALBUMARTISTSORT": "Lemon Demon", "TOTALTRACKS": "27", "RELEASETYPE": "album", "MUSICBRAINZ_ALBUMID": "80f33b28-89b3-4ec7-bf30-bc7c943104c2", "MEDIA": "Digital Media", "LABEL": "[no label]", "ARTISTS": "Lemon Demon", "MUSICBRAINZ_ALBUMARTISTID": "6b014cfd-4927-4187-a741-715998e6d785", "RELEASESTATUS": "official", "ORIGINALDATE": "2016-02-29", "COMMENT": "Visit https://lemondemon.bandcamp.com", "DATE": "2016-02-29", "disc": "1", "ASIN": "B01CB5SHD8", "track": "1", "album_artist": "Lemon Demon", "SCRIPT": "Latn", "ALBUM": "Spirit Phone", "TOTALDISCS": "1", "MUSICBRAINZ_TRACKID": "db2f58bd-649e-4006-83ad-58a2c2194aa1", "ARTIST": "Lemon Demon", "RELEASECOUNTRY": "US", "MUSICBRAINZ_ARTISTID": "6b014cfd-4927-4187-a741-715998e6d785", "MUSICBRAINZ_RELEASETRACKID": "4d3e616f-1da2-4503-9c5a-8d6d91a97124", "TRACKTOTAL": "27", "DISCTOTAL": "1"}}}
\ No newline at end of file