如果您是音乐家或音乐爱好者,您可能以前曾经听说过Bandcamp。 许多独立和DIY乐队都使用它来上传他们的专辑,出售商品并显示即将上演的节目。
作为一名噪音艺术家,我也将自己的一些创作上传到该网站。 在这样做的过程中,我了解到他们对于专辑和曲目上传的大小限制非常宽松:
- 如何使用Google Daydream和WebAudio构建星际VR CommLink
- 家庭录音场景的主导地位| 对专业音乐工作室意味着什么?
- Hidizs EX-01对于深色IEM具有很好的价值
- 杜比全景声(Dolby Atmos)条形音箱:寻找市场的产品
- 使用Mac终端操作音频

作为一名黑客,这立即激起了我的兴趣:
您是在告诉我我可以上传291MB的数据,次数是我想要的多少? 更不用说,如果我想升级到600MB,我只需要在自己身上花费20美元?
这催生了BandcampFS的想法!
(https://github.com/tuxxy/BandcampFS)
我编写的BandcampFS是一种工具,用于实现将Bandcamp用作存储介质的目标。 关于它的最好的事情之一是它使用Python标准库进行所有操作! 没有外部依赖!
在短短的一个小时内,我写了BandcampFS将任何二进制文件转换为WAV文件。 我选择WAV格式有两个原因:
- Bandcamp仅允许WAV,AIFF和FLAC上传。
- WAV格式很简单,位于Python标准库中。
此外,WAV是一种无损格式,因此任何转换后的数据都将精确到原始文件。 这意味着如果我有20MB的照片并将其转换为WAV文件,则大小将为20MB +标头,无论如何应小于1MB。
让我们深入研究Python的wave模块:(https://docs.python.org/3/library/wave.html)
编码方式
导入wave with open('test_photo.jpg','rb')为f: 数据= f.read()wav_file = wave.open('test.wav','wb') wav_file.setnchannels(1) wav_file.setsampwidth(2) wav_file.setframerate(44100)wav_file.writeframes(数据) wav_file.close()
上面的代码打开一张名为“ test_photo.jpg”的照片,并从中读取数据。 然后,它打开一个名为“ test.wav”的新文件,并允许我们向其中写入数据。
wav_file.setnchannels(1)
这将设置音频中的声道数量,其中1为单声道,2为立体声。 我们只需要一个通道即可使用。
wav_file.setsampwidth(2)
在WAV格式中,我们将声音数据编码为帧。 在这里,我们只是声明每帧将有两个字节。 这与我们的频道数量(一个)匹配。 对于单声道的PCM编码,应将其设置为2或16位。
我了解到,如果您没有正确设置此设置,Bandcamp会认为由于编码错误,该文件无效。
wav_file.setframerate(44100)
这只是轨道的帧速率,即我们正在播放的帧数。 通常,此采样率设置为44100。
wav_file.writeframes(数据)
这会将我们的照片数据以正确数量的“ nframe”写入WAV文件的框架。 将此与同一个模块中的writeframesraw函数进行比较。
解码
导入wavewav_file = wave.open('test.wav','wb')num_frames = wav_file.getnframes() 数据= wav_file.readframes(num_frames) wav_file.close(),其中open('new_test.jpg','wb')为f: f.write(数据)
此代码从上面解码“ test.wav”文件。 请记住,这是一张编码为声音的照片。 然后,我们打开一个新文件“ new_test.jpg”,并将原始数据放入其中。
num_frames = wav_file.getnframes()
这一切都告诉我们文件中有多少帧。 如果您想进行检查,则应等于原始未编码文件大小的一半。 如果它是一个10字节的文件,则应为5帧。
这是因为我们将样本宽度编码时设置为每帧两个字节。
数据= wav_file.readframes(num_frames)
这将从您提供的帧数中读取数据。 这是来自原始未编码文件的原始数据。
让我们来看一个实际的例子。 我们将最新的Arch Linux版本(截至撰写时为07–01)作为WAV文件上传到Bandcamp,并将其存储在其中。
步骤1:分割档案
由于Bandcamp的每条曲目限制为291MB,Arch Linux的限制为510MB,因此我们需要将其拆分以上传。
$ split -b 260M archlinux-2017.07.01-x86_64.iso
这会将文件分为两部分,输出两个名为“ xaa”和“ xab”的文件。 让我们重命名它们:
$ mv xaa arch_1 $ mv xab arch_2
检查文件大小以确认:
$ du -hs arch * 2.6亿arch_1 250M arch_2 510M archlinux-2017.07.01-x86_64.iso
看起来不错!
步骤2:转换为WAV
使用BandcampFS脚本很容易!
$ ./bandcampfs.py --encode arch_1 数据编码为:arch_1.wav! $ ./bandcampfs.py-编码arch_2 数据编码为:arch_2.wav!
聆听文件! 我喜欢找出各种文件的声音。 arch_1.wav的开头听起来特别酷!
第3步:上传到Bandcamp!

根据您的上传速度,这可能会花费一些时间,并且肯定是该黑客最烦人的部分。
步骤4:下载专辑并解码
https://bullswillriot.bandcamp.com/album/arch-linux-07-01
我们必须将专辑下载为WAV,否则将无法正确解码。 这将包含三个轨道:arch_1,arch_2和我的狗的.mov奖励轨道! 如果要进行验证,我已将arch文件的SHA1校验和包含在轨道信息中。
现在,我们将解压缩专辑并解码:
$ unzip bulls \ will \ riot \-\ Arch \ Linux \ \(07-01 \)。zip 存档:公牛将暴动-Arch Linux(07-01).zip 提取:公牛将暴动-Arch Linux(07-01)-01 arch_1.wav 提取:公牛将暴动-Arch Linux(07-01)-02 arch_2.wav 提取:公牛将暴动-Arch Linux(07-01)-03 cookie.mov.wav 提取:公牛会暴动-Arch Linux(07-01)-cover.png $ ./bandcampfs.py -d bulls \ will \ riot \-\ Arch \ Linux \ \(07-01 \)\-\ 01 \ arch_1 .wav 数据解码为:公牛将暴动-Arch Linux(07-01)-01 arch_1!$ ./bandcampfs.py -d bulls \ will \ riot \-\ Arch \ Linux \((07-01 \)\--\ 02 \ arch_2.wav 数据解码为:公牛将暴动-Arch Linux(07-01)-02 arch_2!
好吧,这看起来不错! 让我们将这两个文件放在一起,以创建原始ISO并比较校验和:
$ cat bulls \ will \ riot \-\ Arch \ Linux \ \(07-01 \)\-\\ 01 \ arch_1 bulls \ will \ riot \-\ Arch \ Linux \ \(07-01 \)\-\\ 02 \ arch_2> arch_linux.iso
我们正在使用cat实用程序将两个文件连接在一起。 现在是时候比较校验和了! 该镜像的SHA1校验和为:
dd03d811211c332d29155069d8e4bb2306c70f33 archlinux-2017.07.01-x86_64.iso
让我们看看我们的“ arch_linux.iso”文件是什么…
$ shasum arch_linux.iso dd03d811211c332d29155069d8e4bb2306c70f33 arch_linux.iso
成功!! 我们的文件保留了完整性,我们也免费将其存储在Bandcamp中!
现在,这只是一个概念证明,显示了人们如何将Bandcamp用作存储或备份服务。 我并不是想说服任何人从他们当前的解决方案过渡到这种骇人听闻的方法。 我只是想看看我是否能做到。
如果您对此很认真,则可以创建一个私人的Bandcamp专辑,这样没人能看到您的数据。 上传之前,我还将使用GPG加密数据,以便只有您可以访问纯文本。
我不知道。 我有兴趣尝试查看是否可以将Bandcamp用作C2(命令和控制)服务器。 那将非常有趣!
尝试自动执行此过程也将很有趣。 也许可以将其用作数据渗透的手段?
如果您喜欢这个,请随时在Twitter上关注我!