Compare commits
47 Commits
69b2b46311
...
master
Author | SHA1 | Date | |
---|---|---|---|
5b3c01607d | |||
c11cf9202f | |||
4a7a367547 | |||
0085d4dee2 | |||
d3648342e5 | |||
642edffcfe | |||
b449ded8fe | |||
93a2d7e329 | |||
7be7397ab1 | |||
e66fdf942a | |||
d2c5e8cdb9 | |||
fc62233d3f | |||
5caeecb0e7 | |||
271c4bfc92 | |||
7d90433a9a | |||
30f67ab42b | |||
2acd572e8e | |||
e4c6e42efb | |||
ca5302f42f | |||
3b40a9d62f | |||
71c14465b2 | |||
f5abc5a54b | |||
307dd6b0dc | |||
bbb71a7c49 | |||
f4316e598d | |||
76fb8c521d | |||
ccc631b2ac | |||
a463742cf6 | |||
b352f4eff6 | |||
abdfc240e0 | |||
a544d40d3d | |||
3d4e8e08a6 | |||
b30468670f | |||
1b51cab9ab | |||
204eb0d6f6 | |||
0a79a40a64 | |||
849f7fb67a | |||
b67dcde975 | |||
fe7924cbb5 | |||
25403cdc12 | |||
4dfbef6470 | |||
f4386b1785 | |||
e1debf99fd | |||
870723509b | |||
0aa2f9bc96 | |||
5d6297b01e | |||
3d4207467a |
10
JavaScripts/HelloWorld
Executable file
10
JavaScripts/HelloWorld
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/env -S java --source 11
|
||||
|
||||
class Main {
|
||||
public static void main(String args[]) {
|
||||
System.out.println("HelloWorld!");
|
||||
|
||||
// Print the sum of 1 and 2
|
||||
System.out.println(1 + 2);
|
||||
}
|
||||
}
|
66
ObsidianUpdateChecker/main.py
Normal file
66
ObsidianUpdateChecker/main.py
Normal file
@ -0,0 +1,66 @@
|
||||
# Import json parsing and urllib
|
||||
import json
|
||||
import urllib.request
|
||||
# Import subprocess for running dpkg
|
||||
import subprocess
|
||||
|
||||
# Endpoint for the latest release
|
||||
API_URL = "https://api.github.com/repos/obsidianmd/obsidian-releases/releases/latest"
|
||||
|
||||
# DEB file name, will be filled in later
|
||||
DEB_NAME = ""
|
||||
# URL for the latest deb file, will be filled in later
|
||||
DEB_URL = ""
|
||||
# Version number, will be filled in later
|
||||
DEB_VERSION = ""
|
||||
# Installed version number, will be filled in later
|
||||
INSTALLED_VERSION = ""
|
||||
|
||||
# Get the latest release from the API
|
||||
with urllib.request.urlopen(API_URL) as url:
|
||||
data = json.loads(url.read().decode())
|
||||
assets = data["assets"]
|
||||
for asset in assets:
|
||||
if asset["name"].endswith(".deb"):
|
||||
DEB_NAME = asset["name"]
|
||||
DEB_URL = asset["browser_download_url"]
|
||||
|
||||
# Parse the version number from the deb file name
|
||||
# Example: obsidian_0.12.15_amd64.deb -> 0.12.15
|
||||
DEB_VERSION = DEB_NAME.split("_")[1]
|
||||
|
||||
print("Latest version: " + DEB_VERSION)
|
||||
|
||||
# Get the installed version number by parsing the output of dpkg -s obsidian
|
||||
output = subprocess.run(["dpkg", "-s", "obsidian"], capture_output=True)
|
||||
# Parse the output for the version number
|
||||
# Example: Version: 0.12.15
|
||||
for line in output.stdout.decode().split("\n"):
|
||||
if line.startswith("Version:"):
|
||||
INSTALLED_VERSION = line.split(" ")[1]
|
||||
|
||||
print("Installed version: " + INSTALLED_VERSION)
|
||||
|
||||
def semver_check_new(old, new):
|
||||
# Split the version numbers into arrays of numbers
|
||||
old_split = old.split(".")
|
||||
new_split = new.split(".")
|
||||
# Loop through the numbers
|
||||
for i in range(len(old_split)):
|
||||
# If the new version is higher, return true
|
||||
if int(new_split[i]) > int(old_split[i]):
|
||||
return True
|
||||
# If the new version is the same or lower, return false
|
||||
return False
|
||||
|
||||
# Check if the new version is higher than the installed version
|
||||
if semver_check_new(INSTALLED_VERSION, DEB_VERSION):
|
||||
print("New version available!")
|
||||
# Download the deb file
|
||||
urllib.request.urlretrieve(DEB_URL, DEB_NAME)
|
||||
# Install the deb file
|
||||
subprocess.run(["pkexec", "apt", "install", f"./{DEB_NAME}"])
|
||||
# Remove the deb file
|
||||
subprocess.run(["rm", DEB_NAME])
|
||||
else:
|
||||
print("No new version available")
|
122
OpenAsarInjector/main.py
Normal file
122
OpenAsarInjector/main.py
Normal file
@ -0,0 +1,122 @@
|
||||
ASAR = "app.asar"
|
||||
ASAR_BACKUP = ASAR + ".bak"
|
||||
SYMLINK_PATH = ""
|
||||
REAL_PATH = ""
|
||||
DISCORD_FOLDER = ""
|
||||
RESOURCES_PATH = ""
|
||||
|
||||
def root():
|
||||
import os
|
||||
if os.geteuid() != 0:
|
||||
print("Script not running as root")
|
||||
exit()
|
||||
|
||||
def backup():
|
||||
import os
|
||||
# Check for existing backup
|
||||
if os.path.isfile(RESOURCES_PATH + ASAR_BACKUP):
|
||||
print("Backup already exists, openasar is already installed")
|
||||
exit()
|
||||
try:
|
||||
print(RESOURCES_PATH + ASAR)
|
||||
os.rename(RESOURCES_PATH + ASAR, RESOURCES_PATH + ASAR_BACKUP)
|
||||
except Exception as e:
|
||||
print("Couldn't rename file: " + str(e))
|
||||
|
||||
def find():
|
||||
import os
|
||||
from shutil import which
|
||||
|
||||
# Get full path of discord symlink on path
|
||||
global SYMLINK_PATH
|
||||
SYMLINK_PATH = which("discord")
|
||||
# Parse real path of discord symlink
|
||||
global REAL_PATH
|
||||
REAL_PATH = os.path.realpath(SYMLINK_PATH)
|
||||
# Get containing folder
|
||||
global DISCORD_FOLDER
|
||||
DISCORD_FOLDER = os.path.dirname(REAL_PATH)
|
||||
# Add /resources/ to the real path
|
||||
global RESOURCES_PATH
|
||||
RESOURCES_PATH = DISCORD_FOLDER + "/resources/"
|
||||
|
||||
|
||||
def download():
|
||||
import urllib.request
|
||||
import json
|
||||
# Get nightly release from github
|
||||
# url: https://github.com/GooseMod/OpenAsar/
|
||||
# release: https://github.com/GooseMod/OpenAsar/releases/tag/nightly
|
||||
API_URL = "https://api.github.com/repos/GooseMod/OpenAsar/releases/latest"
|
||||
DOWNLOAD_URL = ""
|
||||
|
||||
with urllib.request.urlopen(API_URL) as url:
|
||||
data = json.loads(url.read().decode())
|
||||
DOWNLOAD_URL = data['assets'][0]['browser_download_url']
|
||||
|
||||
# Download the file
|
||||
urllib.request.urlretrieve(DOWNLOAD_URL, RESOURCES_PATH + ASAR)
|
||||
|
||||
def kill():
|
||||
import os
|
||||
import signal
|
||||
import psutil
|
||||
|
||||
# Get discord process
|
||||
for proc in psutil.process_iter():
|
||||
if proc.name() == "Discord":
|
||||
# Kill discord
|
||||
os.kill(proc.pid, signal.SIGTERM)
|
||||
|
||||
def uninstall():
|
||||
import os
|
||||
if os.path.isfile(RESOURCES_PATH + ASAR_BACKUP):
|
||||
try:
|
||||
os.remove(RESOURCES_PATH + ASAR)
|
||||
os.rename(RESOURCES_PATH + ASAR_BACKUP, RESOURCES_PATH + ASAR)
|
||||
except Exception as e:
|
||||
print("Couldn't remove/rename file: " + str(e))
|
||||
else:
|
||||
print("No backup found, openasar is not installed")
|
||||
exit()
|
||||
|
||||
|
||||
# Should check if the package has been updated, as discords asar is much larger
|
||||
def sanity_check():
|
||||
import os
|
||||
# Get file size of asar
|
||||
asar_size = os.path.getsize(RESOURCES_PATH + ASAR)
|
||||
# If the asar is larger than 1MB, discord has probably updated
|
||||
if asar_size > 1000000:
|
||||
print("Discord has probably updated, please clear backups and reinstall")
|
||||
print("Would you like to clear backups? (y/n)")
|
||||
answer = input().lower()
|
||||
if answer == "y":
|
||||
if os.path.isfile(RESOURCES_PATH + ASAR_BACKUP):
|
||||
os.remove(RESOURCES_PATH + ASAR_BACKUP)
|
||||
print("Backup cleared, installation will continue as normal")
|
||||
print("Backups cleared, installation will continue as normal")
|
||||
else:
|
||||
print("Backups not cleared, please clean manually")
|
||||
exit()
|
||||
|
||||
|
||||
def main():
|
||||
import sys
|
||||
root()
|
||||
kill()
|
||||
find()
|
||||
sanity_check()
|
||||
if len(sys.argv) > 1:
|
||||
if sys.argv[1] == "uninstall":
|
||||
uninstall()
|
||||
print("Uninstalled openasar")
|
||||
else:
|
||||
print("Unknown argument")
|
||||
else:
|
||||
backup()
|
||||
download()
|
||||
print("Installed openasar")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
@ -26,7 +26,7 @@ if (Test-Path $location) {
|
||||
Write-Host $newPipConfig
|
||||
|
||||
# Write the new content to the file
|
||||
$newPipConfig | Out-File $location -Force
|
||||
$newPipConfig | Out-File $location -Force -Encoding utf8
|
||||
} else {
|
||||
# If it doesn't exist, create it
|
||||
New-Item -Path $location -ItemType File
|
||||
|
1
PlexMusicFixer/.gitignore
vendored
Normal file
1
PlexMusicFixer/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
dist
|
5
PlexMusicFixer/.idea/.gitignore
generated
vendored
Normal file
5
PlexMusicFixer/.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
12
PlexMusicFixer/.idea/PlexMusicFixer.iml
generated
Normal file
12
PlexMusicFixer/.idea/PlexMusicFixer.iml
generated
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
8
PlexMusicFixer/.idea/modules.xml
generated
Normal file
8
PlexMusicFixer/.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/PlexMusicFixer.iml" filepath="$PROJECT_DIR$/.idea/PlexMusicFixer.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
17
PlexMusicFixer/.idea/runConfigurations/tsc.xml
generated
Normal file
17
PlexMusicFixer/.idea/runConfigurations/tsc.xml
generated
Normal file
@ -0,0 +1,17 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="tsc" type="ShConfigurationType">
|
||||
<option name="SCRIPT_TEXT" value="tsc" />
|
||||
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
|
||||
<option name="SCRIPT_PATH" value="" />
|
||||
<option name="SCRIPT_OPTIONS" value="" />
|
||||
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
||||
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
||||
<option name="INTERPRETER_PATH" value="" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
<option name="EXECUTE_IN_TERMINAL" value="true" />
|
||||
<option name="EXECUTE_SCRIPT_FILE" value="false" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
6
PlexMusicFixer/.idea/vcs.xml
generated
Normal file
6
PlexMusicFixer/.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
3
PlexMusicFixer/TODO.txt
Normal file
3
PlexMusicFixer/TODO.txt
Normal file
@ -0,0 +1,3 @@
|
||||
- Improve typescript support
|
||||
- Need to make the album swap only trigger when the album dropdown is selected
|
||||
- https://stackoverflow.com/questions/11286661/set-custom-attribute-using-javascript
|
251
PlexMusicFixer/src/userscript.ts
Normal file
251
PlexMusicFixer/src/userscript.ts
Normal file
@ -0,0 +1,251 @@
|
||||
// ==UserScript==
|
||||
// @name PlexMusicFixer
|
||||
// @namespace http://tampermonkey.net/
|
||||
// @version 0.1
|
||||
// @description Swaps the order of the artist and album in the Plex Music player to match the order in the library view
|
||||
// @author Isaac Shoebottom
|
||||
// @match https://app.plex.tv/desktop/
|
||||
// @icon https://www.google.com/s2/favicons?sz=64&domain=plex.tv
|
||||
// @grant none
|
||||
// ==/UserScript==
|
||||
|
||||
"use strict"
|
||||
|
||||
let musicLibraryNames: string[] = [
|
||||
"Music",
|
||||
]
|
||||
// How often should scripts run, in milliseconds
|
||||
let interval = 1e2
|
||||
// Keep track of all intervals
|
||||
let intervalIds: number[] = []
|
||||
let decidedIntervalIds: number[] = []
|
||||
|
||||
/**
|
||||
* Checks if the current page is a music page
|
||||
*/
|
||||
function isMusicPage(): boolean {
|
||||
// Find the current library name
|
||||
// Library title has the class selector "PageHeaderTitle-title"
|
||||
let nodes = document.querySelectorAll("[class*=\"PageHeaderTitle-title\"]")
|
||||
|
||||
if (nodes.length === 0) {
|
||||
log("No library name found")
|
||||
return false
|
||||
}
|
||||
|
||||
let libraryName = nodes.item(0).innerHTML
|
||||
return musicLibraryNames.includes(libraryName)
|
||||
}
|
||||
|
||||
/**
|
||||
* Decides what page we're on, and runs the appropriate function
|
||||
*/
|
||||
function decidePage(): void {
|
||||
// Clear all intervals
|
||||
for (let id of intervalIds) {
|
||||
clearInterval(id)
|
||||
}
|
||||
|
||||
// Always check, so these need to be extra safe
|
||||
let id = setInterval(alwaysCheck, interval)
|
||||
intervalIds.push(id)
|
||||
|
||||
if (!isMusicPage()) {
|
||||
log("Not music page")
|
||||
return
|
||||
}
|
||||
|
||||
let url = window.location.href
|
||||
if (url.includes("com.plexapp.plugins.library")) {
|
||||
log("Library page")
|
||||
let id = setInterval(libraryPage, interval)
|
||||
intervalIds.push(id)
|
||||
} else if (url.includes("details?key=%2Flibrary%2Fmetadata")) {
|
||||
log("Details page")
|
||||
let id = setInterval(albumPage, interval)
|
||||
intervalIds.push(id)
|
||||
}
|
||||
|
||||
|
||||
for (let id of decidedIntervalIds) {
|
||||
clearInterval(id)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Swaps the artist and album in each card
|
||||
*/
|
||||
function swapCards(cards): void {
|
||||
// For each card, get all html elements, and swap the second and third elements
|
||||
for (let card of cards) {
|
||||
// Check if the card has already been swapped
|
||||
if (card.attributes.swap) {
|
||||
continue
|
||||
}
|
||||
|
||||
let elements = card.children
|
||||
let artist = elements.item(1)
|
||||
let album = elements.item(2)
|
||||
card.insertBefore(album, artist)
|
||||
|
||||
// Album has isSecondary
|
||||
let secondaryClass = album.className.split(" ").find((className) => className.includes("isSecondary"))
|
||||
|
||||
// Remove isSecondary from album
|
||||
album.classList.remove(secondaryClass)
|
||||
|
||||
// Add isSecondary to artist
|
||||
artist.classList.add(secondaryClass)
|
||||
|
||||
// Add a swap property to the card, so we can check if it's already been swapped
|
||||
card.attributes.swap = true
|
||||
|
||||
logSwap(artist.innerText, album.innerText)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Logic for library pages
|
||||
*/
|
||||
function libraryPage() {
|
||||
// Select all divs with the attribute data-testid="cellItem"
|
||||
let cards = document.querySelectorAll("[data-testid=\"cellItem\"]")
|
||||
if (cards.length === 0) {
|
||||
log("No cards found")
|
||||
return
|
||||
}
|
||||
swapCards(cards)
|
||||
}
|
||||
|
||||
/**
|
||||
* Logic for album pages
|
||||
*/
|
||||
function albumPage() {
|
||||
let metadata = document.querySelectorAll("[data-testid=\"metadata-top-level-items\"]")
|
||||
// Two divs down from metadata is the container for the artist and album
|
||||
let container: any = metadata.item(0).children.item(0).children.item(0)
|
||||
if (container.attributes.swap) {
|
||||
return
|
||||
}
|
||||
|
||||
// Check if the container has two children, so there isn't null errors
|
||||
if (container.children.length < 2) {
|
||||
log("Not on album page")
|
||||
return
|
||||
}
|
||||
let artist = container.children.item(0)
|
||||
let album = container.children.item(1)
|
||||
// Check if the artist and album are what we're looking for, so we don't swap the wrong elements
|
||||
if (
|
||||
artist.attributes.getNamedItem("data-testid").value !== "metadata-title" ||
|
||||
album.attributes.getNamedItem("data-testid").value !== "metadata-subtitle"
|
||||
) {
|
||||
log("Not on album page")
|
||||
return
|
||||
}
|
||||
|
||||
container.insertBefore(album, artist)
|
||||
|
||||
let newArtist = document.createElement("h2")
|
||||
let newAlbum = document.createElement("h1")
|
||||
newArtist.innerHTML = artist.innerHTML
|
||||
newAlbum.innerHTML = album.innerHTML
|
||||
|
||||
// Copy all attributes from album to newArtist
|
||||
for (let attr of album.attributes) {
|
||||
newArtist.setAttribute(attr.name, attr.value)
|
||||
}
|
||||
// Copy all attributes from artist to newAlbum
|
||||
for (let attr of artist.attributes) {
|
||||
newAlbum.setAttribute(attr.name, attr.value)
|
||||
}
|
||||
|
||||
artist.replaceWith(newArtist)
|
||||
album.replaceWith(newAlbum)
|
||||
|
||||
// Add a swap property to the container, so we can check if it's already been swapped
|
||||
container.attributes.swap = true
|
||||
|
||||
logSwap(artist.innerText, album.innerText)
|
||||
}
|
||||
|
||||
function alwaysCheck() {
|
||||
soundtrackCheck()
|
||||
playerCheck()
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the current page is a soundtrack element, and swaps the artist and album if it is
|
||||
*/
|
||||
function soundtrackCheck() {
|
||||
// Select for elements with the title="Soundtracks" attribute
|
||||
let soundtracks = document.querySelectorAll("[title=\"Soundtracks\"]")
|
||||
if (soundtracks.length !== 0) {
|
||||
// Get holder of soundtrack cards
|
||||
let root = soundtracks.item(0).parentElement.parentElement.parentElement
|
||||
let cardHolder = root.lastElementChild.lastElementChild.lastElementChild
|
||||
swapCards(cardHolder.children)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for a few elements that could be present, and swaps the artist and album if they are
|
||||
*/
|
||||
function playerCheck() {
|
||||
// Mini player
|
||||
let player = document.querySelectorAll("[class*=\"PlayerControlsMetadata-container\"]")
|
||||
if (player.length !== 0) {
|
||||
let playerMetadata = player.item(0)
|
||||
let holder = playerMetadata.children.item(1)
|
||||
swapPlayer(holder)
|
||||
}
|
||||
// Big player
|
||||
let bigPlayer = document.querySelectorAll("[class*=\"AudioVideoFullMusic-titlesContainer\"]")
|
||||
if (bigPlayer.length !== 0) {
|
||||
let playerMetadata = bigPlayer.item(0)
|
||||
let holder = playerMetadata.children.item(1)
|
||||
swapPlayer(holder)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Swaps the artist and album in the player
|
||||
*/
|
||||
function swapPlayer(holder) {
|
||||
if (holder.attributes.swap) {
|
||||
return
|
||||
}
|
||||
let artist = holder.children.item(0)
|
||||
let dash = holder.children.item(1)
|
||||
let album = holder.children.item(2)
|
||||
// Swap artist and album
|
||||
// Remove all children
|
||||
holder.removeChild(artist)
|
||||
holder.removeChild(dash)
|
||||
holder.removeChild(album)
|
||||
// Add back in the correct order
|
||||
holder.appendChild(album)
|
||||
holder.appendChild(dash)
|
||||
holder.appendChild(artist)
|
||||
holder.attributes.swap = true
|
||||
}
|
||||
|
||||
function logSwap(artist, album) {
|
||||
log("Swapped artist: " + artist + " and album: " + album)
|
||||
}
|
||||
|
||||
function log(message: string): void {
|
||||
console.log("PlexMusicFixer: " + message)
|
||||
}
|
||||
|
||||
// "Main"
|
||||
// On href change, run decidePage
|
||||
let href = ""
|
||||
const observer = new MutationObserver(() => {
|
||||
if (window.location.href !== href) {
|
||||
href = window.location.href
|
||||
log("Deciding page")
|
||||
decidedIntervalIds.push(setInterval(decidePage, interval))
|
||||
}
|
||||
})
|
||||
observer.observe(document, { childList: true, subtree: true })
|
13
PlexMusicFixer/tsconfig.json
Normal file
13
PlexMusicFixer/tsconfig.json
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es2020",
|
||||
"outDir": "dist",
|
||||
},
|
||||
"include": [
|
||||
"src/**/*.ts"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
],
|
||||
}
|
37
Rainbow/rainbow.js
Normal file
37
Rainbow/rainbow.js
Normal file
@ -0,0 +1,37 @@
|
||||
// Approximate racket functions
|
||||
function circle(color) {
|
||||
print(`${color} circle`)
|
||||
}
|
||||
function square(color) {
|
||||
print(`${color} square`)
|
||||
}
|
||||
function print(shape) {
|
||||
console.log(shape)
|
||||
}
|
||||
// Cuz javascript doesn't have functional primitives
|
||||
function first(list) {
|
||||
return list[0]
|
||||
}
|
||||
function rest(list) {
|
||||
return list.slice(1)
|
||||
}
|
||||
|
||||
// Helper to cycle through the functions
|
||||
function cycle(list) {
|
||||
return rest(list).concat(first(list))
|
||||
}
|
||||
|
||||
// The actual function
|
||||
function rainbow(...functions) {
|
||||
let colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
|
||||
function rainbowRecursive(functions, colors) {
|
||||
if (colors.length === 0) {
|
||||
return
|
||||
}
|
||||
first(functions)(first(colors))
|
||||
rainbowRecursive(cycle(functions), rest(colors))
|
||||
}
|
||||
rainbowRecursive(functions, colors)
|
||||
}
|
||||
|
||||
rainbow(circle, square)
|
17
Rainbow/rainbow.rkt
Normal file
17
Rainbow/rainbow.rkt
Normal file
@ -0,0 +1,17 @@
|
||||
#lang racket
|
||||
(require pict)
|
||||
(require pict/color)
|
||||
; The actual function
|
||||
(define (rainbow . shapes)
|
||||
(define colors (list red orange yellow green blue purple))
|
||||
(define (cycle lst) (append (rest lst) (list (first lst))))
|
||||
(define (rainbow-recursive shapes colors)
|
||||
(cond
|
||||
[(empty? colors) (void)]
|
||||
[(print((first colors) (first shapes)))
|
||||
(rainbow-recursive (cycle shapes) (rest colors))]
|
||||
)
|
||||
)
|
||||
(rainbow-recursive shapes colors))
|
||||
; Example usage
|
||||
(rainbow (filled-rectangle 25 25) (filled-ellipse 25 25))
|
72
RemoveVersion/RemoveVersion.ps1
Normal file
72
RemoveVersion/RemoveVersion.ps1
Normal file
@ -0,0 +1,72 @@
|
||||
# Get each folder in the current directory
|
||||
$folders = Get-ChildItem -Directory
|
||||
|
||||
# Array to store the folders that need to be renamed
|
||||
$work = @()
|
||||
|
||||
foreach ($folder in $folders) {
|
||||
# Find the version number in the folder name
|
||||
$version = $folder.Name -match '(\d+\.\d+\.\d+\.\d+)'
|
||||
if ($version) {
|
||||
# Replace entire folder name with the version number
|
||||
$new_name = $matches[0]
|
||||
|
||||
# if version has a alpha character, remove it, eg 0.1.0a, then re-add it to new name
|
||||
$alpha = $folder.Name -match '(\d+\.\d+\.\d+\.\d+)([a-zA-Z])'
|
||||
if ($alpha) {
|
||||
$new_name = $matches[1]
|
||||
$new_name = $new_name + $matches[2]
|
||||
}
|
||||
$toadd = New-Object PSObject
|
||||
$toadd | Add-Member -MemberType NoteProperty -Name path -Value $folder.FullName
|
||||
$toadd | Add-Member -MemberType NoteProperty -Name newname -Value $new_name
|
||||
$work += $toadd
|
||||
|
||||
Write-Host "Rename $folder to $new_name"
|
||||
continue
|
||||
}
|
||||
# Find the version number in the folder name
|
||||
$version = $folder.Name -match '(\d+\.\d+\.\d+)'
|
||||
if ($version) {
|
||||
# Replace entire folder name with the version number
|
||||
$new_name = $matches[0]
|
||||
|
||||
# if version has a alpha character, remove it, eg 0.1.0a, then re-add it to new name
|
||||
$alpha = $folder.Name -match '(\d+\.\d+\.\d+)([a-zA-Z])'
|
||||
if ($alpha) {
|
||||
$new_name = $matches[1]
|
||||
$new_name = $new_name + $matches[2]
|
||||
}
|
||||
$toadd = New-Object PSObject
|
||||
$toadd | Add-Member -MemberType NoteProperty -Name path -Value $folder.FullName
|
||||
$toadd | Add-Member -MemberType NoteProperty -Name newname -Value $new_name
|
||||
$work += $toadd
|
||||
|
||||
Write-Host "Rename $folder to $new_name"
|
||||
continue
|
||||
}
|
||||
# Find the version number in the folder name
|
||||
$version = $folder.Name -match '(\d+\.\d+)'
|
||||
if ($version) {
|
||||
# Replace entire folder name with the version number
|
||||
$new_name = $matches[0]
|
||||
|
||||
# if version has a alpha character, remove it, eg 0.1.0a, then re-add it to new name
|
||||
$alpha = $folder.Name -match '(\d+\.\d+)([a-zA-Z])'
|
||||
if ($alpha) {
|
||||
$new_name = $matches[1]
|
||||
$new_name = $new_name + $matches[2]
|
||||
}
|
||||
$toadd = New-Object PSObject
|
||||
$toadd | Add-Member -MemberType NoteProperty -Name path -Value $folder.FullName
|
||||
$toadd | Add-Member -MemberType NoteProperty -Name newname -Value $new_name
|
||||
$work += $toadd
|
||||
|
||||
Write-Host "Rename $folder to $new_name"
|
||||
continue
|
||||
}
|
||||
}
|
||||
Read-Host -Prompt "Press Enter to continue"
|
||||
foreach ($item in $work) {
|
||||
Rename-Item -Path $item.path -NewName $item.newname
|
||||
}
|
26
ScoopCompare/ScoopCompare.js
Normal file
26
ScoopCompare/ScoopCompare.js
Normal file
@ -0,0 +1,26 @@
|
||||
// Run with node
|
||||
|
||||
// Read ~/scoop/apps.json and compare it to scoop export
|
||||
// Then display the differences in the installed apps and the apps.json file
|
||||
|
||||
// read apps.json file
|
||||
let fs = require('fs');
|
||||
let apps = fs.readFileSync('C:/Users/Isaac/scoop/apps.json', 'utf8');
|
||||
apps = JSON.parse(apps);
|
||||
apps = apps.apps;
|
||||
|
||||
// run scoop export in shell and save output to variable
|
||||
let { execSync } = require('child_process');
|
||||
let installedApps = execSync('scoop export').toString();
|
||||
installedApps = JSON.parse(installedApps);
|
||||
installedApps = installedApps.apps;
|
||||
|
||||
// Make a set out of each of the arrays on the Name property
|
||||
let appsSet = new Set(apps.map(app => app.Name));
|
||||
let installedAppsSet = new Set(installedApps.map(app => app.Name));
|
||||
|
||||
// Find the difference between the two sets
|
||||
let diffFromInstalledApps = new Set([...appsSet].filter(x => !installedAppsSet.has(x)));
|
||||
let diffFromApps = new Set([...installedAppsSet].filter(x => !appsSet.has(x)));
|
||||
console.log("Apps in apps.json but not installed: ", diffFromInstalledApps);
|
||||
console.log("Apps installed but not in apps.json: ", diffFromApps);
|
71
ScoopManifestReformatter/reformat.ps1
Normal file
71
ScoopManifestReformatter/reformat.ps1
Normal file
@ -0,0 +1,71 @@
|
||||
<#
|
||||
use this order to reformat json objects:
|
||||
version
|
||||
description
|
||||
homepage
|
||||
license
|
||||
notes
|
||||
depends
|
||||
suggest
|
||||
architecture
|
||||
url
|
||||
hash
|
||||
extract_dir
|
||||
extract_to
|
||||
pre_install
|
||||
installer
|
||||
post_install
|
||||
env_add_path
|
||||
env_set
|
||||
bin
|
||||
shortcuts
|
||||
persist
|
||||
pre_uninstall
|
||||
uninstaller
|
||||
post_uninstall
|
||||
checkver
|
||||
autoupdate
|
||||
#>
|
||||
|
||||
# Read all json files in the current directory
|
||||
Get-ChildItem -Filter *.json | ForEach-Object {
|
||||
# Read the file
|
||||
$json = Get-Content $_.FullName | ConvertFrom-Json -Depth 9
|
||||
|
||||
# Create a new object with the properties in the desired order
|
||||
$newJson = [ordered]@{
|
||||
version = $json.version
|
||||
description = $json.description
|
||||
homepage = $json.homepage
|
||||
license = $json.license
|
||||
notes = $json.notes
|
||||
depends = $json.depends
|
||||
suggest = $json.suggest
|
||||
architecture = $json.architecture
|
||||
url = $json.url
|
||||
hash = $json.hash
|
||||
extract_dir = $json.extract_dir
|
||||
extract_to = $json.extract_to
|
||||
pre_install = $json.pre_install
|
||||
installer = $json.installer
|
||||
post_install = $json.post_install
|
||||
env_add_path = $json.env_add_path
|
||||
env_set = $json.env_set
|
||||
bin = $json.bin
|
||||
shortcuts = $json.shortcuts
|
||||
persist = $json.persist
|
||||
pre_uninstall = $json.pre_uninstall
|
||||
uninstaller = $json.uninstaller
|
||||
post_uninstall = $json.post_uninstall
|
||||
checkver = $json.checkver
|
||||
autoupdate = $json.autoupdate
|
||||
}
|
||||
# Remove any null properties
|
||||
$newJson = $newJson | Where-Object { $_.Value -ne $null }
|
||||
|
||||
# Convert the new object back to json and write it back to the file
|
||||
$newJson | ConvertTo-Json -Depth 9 | Set-Content $_.FullName
|
||||
}
|
||||
|
||||
# Run scoop json prettier on all json files in the current directory
|
||||
~/scoop/apps/scoop/current/bin/formatjson.ps1 -Dir .
|
54
ShowTax/showtax.js
Normal file
54
ShowTax/showtax.js
Normal file
@ -0,0 +1,54 @@
|
||||
// ==UserScript==
|
||||
// @name New Userscript
|
||||
// @namespace http://tampermonkey.net/
|
||||
// @version 2024-04-12
|
||||
// @description try to take over the world!
|
||||
// @author You
|
||||
// @match https://www.amazon.ca/*
|
||||
// @grant none
|
||||
// @run-at document-idle
|
||||
// ==/UserScript==
|
||||
|
||||
(function() {
|
||||
const TAX = 0.15;
|
||||
|
||||
// Todo: decide if it should just round up to the nearest dollar
|
||||
// Todo: fix queryselectorall only finding one element at a time
|
||||
|
||||
const changeNode = function(node) {
|
||||
var wholeNode = node.querySelector('.a-price-whole');
|
||||
var fractionNode = node.querySelector('.a-price-fraction');
|
||||
var whole = wholeNode ? wholeNode.textContent : '0';
|
||||
var fraction = fractionNode ? fractionNode.textContent : '0';
|
||||
whole = parseInt(whole);
|
||||
fraction = parseInt(fraction);
|
||||
whole += whole * TAX;
|
||||
fraction += fraction * TAX;
|
||||
whole = Math.floor(whole);
|
||||
fraction = Math.floor(fraction);
|
||||
if (fraction >= 100) {
|
||||
whole += 1;
|
||||
fraction -= 100;
|
||||
}
|
||||
if (fraction < 10) {
|
||||
fraction = '0' + fraction;
|
||||
}
|
||||
wholeNode.textContent = whole;
|
||||
fractionNode.textContent = fraction;
|
||||
}
|
||||
|
||||
const find = function() {
|
||||
console.log("Finding price nodes");
|
||||
document.querySelectorAll('.a-price').forEach((node) => {
|
||||
if (node.attributes['found']) {
|
||||
return;
|
||||
}
|
||||
node.attributes['found'] = true;
|
||||
console.log(node);
|
||||
console.log("Price node found")
|
||||
changeNode(node);
|
||||
});
|
||||
}
|
||||
//find();
|
||||
setInterval(find, 1000);
|
||||
})();
|
@ -1,16 +1,26 @@
|
||||
param (
|
||||
[int] [alias('p')] $port = 21,
|
||||
[string] [alias('d')] $directory = '.',
|
||||
[bool] [alias('w')] $write = $false
|
||||
)
|
||||
|
||||
$venv = "\.pyftplib"
|
||||
$venv = $HOME + $venv
|
||||
# Create virtual environment
|
||||
if (-not (Test-Path venv)) {
|
||||
virtualenv venv
|
||||
if (-not (Test-Path $venv)) {
|
||||
write-host "Creating virtual environment at $venv"
|
||||
virtualenv "$venv"
|
||||
}
|
||||
|
||||
# Activate virtual environment
|
||||
.\venv\Scripts\activate.ps1
|
||||
. ($venv + "\Scripts\Activate.ps1")
|
||||
|
||||
# Install dependencies
|
||||
pip install pyftpdlib
|
||||
|
||||
# Run FTP server
|
||||
python -m pyftpdlib
|
||||
|
||||
# Not working for streaming video files
|
||||
# twistd -n ftp -r .
|
||||
if ($write) {
|
||||
python -m pyftpdlib -p $port -d $directory -w
|
||||
} else {
|
||||
python -m pyftpdlib -p $port -d $directory
|
||||
}
|
20
SteamToggleUpdate/ToggleFallout4Updates.ps1
Normal file
20
SteamToggleUpdate/ToggleFallout4Updates.ps1
Normal file
@ -0,0 +1,20 @@
|
||||
$appId = 377160
|
||||
$networkLocation = "https://raw.githubusercontent.com/IsaacShoebottom/Scripts/master/SteamToggleUpdate/ToggleUpdates.ps1"
|
||||
|
||||
# Test if ToggleUpdates.ps1 exists and invoke it if it does
|
||||
If (Test-Path -Path ".\ToggleUpdates.ps1" -PathType Leaf) {
|
||||
.\ToggleUpdates.ps1 $appId
|
||||
}
|
||||
Else {
|
||||
# construct temp path
|
||||
$env:temp = [System.IO.Path]::GetTempPath()
|
||||
$tempPath = $env:temp + "\ToggleUpdates.ps1"
|
||||
|
||||
# Download the network script
|
||||
$wc = New-Object System.Net.WebClient
|
||||
$wc.DownloadFile($networkLocation, $tempPath)
|
||||
# Invoke the network script
|
||||
&$tempPath $appId
|
||||
# Delete the network script
|
||||
Remove-Item -Path $tempPath
|
||||
}
|
20
SteamToggleUpdate/ToggleStardewUpdates.ps1
Normal file
20
SteamToggleUpdate/ToggleStardewUpdates.ps1
Normal file
@ -0,0 +1,20 @@
|
||||
$appId = 413150
|
||||
$networkLocation = "https://raw.githubusercontent.com/IsaacShoebottom/Scripts/master/SteamToggleUpdate/ToggleUpdates.ps1"
|
||||
|
||||
# Test if ToggleUpdates.ps1 exists and invoke it if it does
|
||||
If (Test-Path -Path ".\ToggleUpdates.ps1" -PathType Leaf) {
|
||||
.\ToggleUpdates.ps1 $appId
|
||||
}
|
||||
Else {
|
||||
# construct temp path
|
||||
$env:temp = [System.IO.Path]::GetTempPath()
|
||||
$tempPath = $env:temp + "\ToggleUpdates.ps1"
|
||||
|
||||
# Download the network script
|
||||
$wc = New-Object System.Net.WebClient
|
||||
$wc.DownloadFile($networkLocation, $tempPath)
|
||||
# Invoke the network script
|
||||
&$tempPath $appId
|
||||
# Delete the network script
|
||||
Remove-Item -Path $tempPath
|
||||
}
|
@ -1,7 +1,12 @@
|
||||
# function that takes in an app id as a number and returns the path to the steam library folder that contains the app id
|
||||
function parseVDFforPath([int]$appId) {
|
||||
# Steam libary folder vdf if using scoop
|
||||
$scoopVDF = "$env:USERPROFILE\scoop\apps\steam\current\steamapps\libraryfolders.vdf"
|
||||
# Steam library folders vdf absolute path
|
||||
$steamLibraryFoldersVDF = "C:\Program Files (x86)\Steam\steamapps\libraryfolders.vdf"
|
||||
$normalVDF = "C:\Program Files (x86)\Steam\steamapps\libraryfolders.vdf"
|
||||
|
||||
# Set the path to the vdf file based on whether you are using scoop or not
|
||||
$steamLibraryFoldersVDF = if (Test-Path $scoopVDF) { $scoopVDF } else { $normalVDF }
|
||||
|
||||
# convert the app id to a string
|
||||
$appIdString = $appId.ToString()
|
||||
|
5
VoltorbFlipSpinners/.idea/.gitignore
generated
vendored
Normal file
5
VoltorbFlipSpinners/.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
12
VoltorbFlipSpinners/.idea/VoltorbFlipSpinners.iml
generated
Normal file
12
VoltorbFlipSpinners/.idea/VoltorbFlipSpinners.iml
generated
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
8
VoltorbFlipSpinners/.idea/modules.xml
generated
Normal file
8
VoltorbFlipSpinners/.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/VoltorbFlipSpinners.iml" filepath="$PROJECT_DIR$/.idea/VoltorbFlipSpinners.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
VoltorbFlipSpinners/.idea/vcs.xml
generated
Normal file
6
VoltorbFlipSpinners/.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
84
VoltorbFlipSpinners/src/VoltorbFlipSpinners.js
Normal file
84
VoltorbFlipSpinners/src/VoltorbFlipSpinners.js
Normal file
@ -0,0 +1,84 @@
|
||||
// ==UserScript==
|
||||
// @name Voltorb Flip Spinners
|
||||
// @namespace http://tampermonkey.net/
|
||||
// @version 0.0.2
|
||||
// @description Adds spinners to the inputs of numbers
|
||||
// @author Isaac Shoebottom
|
||||
// @match http://voltorbflip.com/
|
||||
// @icon http://voltorbflip.com/favicon.ico
|
||||
// @grant none
|
||||
// @run-at document-idle
|
||||
// @updateURL https://git.shoebottom.ca/IsaacShoebottom/Scripts/raw/branch/master/VoltorbFlipSpinners/src/VoltorbFlipSpinners.js
|
||||
// @downloadURL https://git.shoebottom.ca/IsaacShoebottom/Scripts/raw/branch/master/VoltorbFlipSpinners/src/VoltorbFlipSpinners.js
|
||||
// ==/UserScript==
|
||||
|
||||
// To add spinners I just need to change the input type from text to numbers
|
||||
|
||||
/**
|
||||
* Finds the board element
|
||||
* @returns {HTMLElement}
|
||||
*/
|
||||
function findBoard() {
|
||||
return document.getElementById("board");
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds all inputs that are children of the passed element
|
||||
* @param {HTMLElement} element
|
||||
* @returns {Array<HTMLElement>}
|
||||
*/
|
||||
function findInputs(element) {
|
||||
// Find all input elements that are children of the root element
|
||||
// Should have the type="text" attribute
|
||||
let col = element.getElementsByTagName("input");
|
||||
// Convert the HTMLCollection to an array
|
||||
return Array.from(col).filter((input) => input.type === "text");
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a spinner to the input element on mouseover
|
||||
* @param {HTMLElement} inputElement
|
||||
* @returns {void}
|
||||
*/
|
||||
function addMouseOverSpinner(inputElement) {
|
||||
console.log("Adding mouseover spinner on element: " + inputElement);
|
||||
inputElement.addEventListener("mouseover", () => {
|
||||
console.log("Mouseover on element: " + inputElement);
|
||||
inputElement.type = "number";
|
||||
});
|
||||
inputElement.addEventListener("mouseout", () => {
|
||||
console.log("Mouseout on element: " + inputElement);
|
||||
inputElement.type = "text";
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the content of the input to be the passed value
|
||||
* @param {HTMLElement} inputElement
|
||||
* @param {number} value
|
||||
* @returns {void}
|
||||
*/
|
||||
function setInputValue(inputElement, value) {
|
||||
console.log("Setting input value of" + inputElement + "to" + value);
|
||||
inputElement.value = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the script
|
||||
* @returns {void}
|
||||
*/
|
||||
function execute() {
|
||||
let board = findBoard();
|
||||
if (!board) {
|
||||
console.log("Could not find board");
|
||||
return;
|
||||
}
|
||||
|
||||
let inputs = findInputs(board);
|
||||
console.log("Found " + inputs.length + " inputs");
|
||||
|
||||
inputs.forEach(addMouseOverSpinner)
|
||||
inputs.forEach((input) => setInputValue(input, 0));
|
||||
}
|
||||
|
||||
execute();
|
12
VolumeFix/VolumeFix.ahk
Normal file
12
VolumeFix/VolumeFix.ahk
Normal file
@ -0,0 +1,12 @@
|
||||
; Fix Windows Volume:
|
||||
$Volume_Up::
|
||||
SoundGet, volume
|
||||
Send {Volume_Up}
|
||||
SoundSet, volume + 1
|
||||
Return
|
||||
|
||||
$Volume_Down::
|
||||
SoundGet, volume
|
||||
Send {Volume_Down}
|
||||
SoundSet, volume - 1
|
||||
Return
|
4
WallpaperEngineTools/ffmpeg-encode.ps1
Normal file
4
WallpaperEngineTools/ffmpeg-encode.ps1
Normal file
@ -0,0 +1,4 @@
|
||||
# Rencode arg file 1 with ffmpeg crf and veryslow preset in x264 format, and audio with aac 192kbps and append "-Small" to the output filename
|
||||
# Usage: ffmpeg-encode.ps1 arg1
|
||||
$file = Get-ChildItem $args[0]
|
||||
ffmpeg -i $file.FullName -c:v libx264 -preset veryslow -crf 20 -c:a aac -b:a 192k "$($file.BaseName)-Small.mp4"
|
12
WallpaperEngineTools/ffmpeg-fix-container.ps1
Normal file
12
WallpaperEngineTools/ffmpeg-fix-container.ps1
Normal file
@ -0,0 +1,12 @@
|
||||
# With ffmpeg simply copy the vidoe and auto contents into an mp4 container
|
||||
|
||||
# args[0] = file path
|
||||
# args[1] = -d or --delete to delete the original file after conversion
|
||||
$file = Get-ChildItem $args[0]
|
||||
$del = $args[1]
|
||||
# Invoke ffmpeg to copy the video and audio streams into an mp4 container
|
||||
ffmpeg -i $file.FullName -c copy "$($file.BaseName).mp4"
|
||||
# Delete the original file if the second argument is -d or --delete
|
||||
if ($del -eq "-d" -or $del -eq "--delete") {
|
||||
Remove-Item $file
|
||||
}
|
0
hq2cd-conv/.idea/.gitignore → archive-rom/.idea/.gitignore
generated
vendored
0
hq2cd-conv/.idea/.gitignore → archive-rom/.idea/.gitignore
generated
vendored
8
archive-rom/.idea/archive-rom.iml
generated
Normal file
8
archive-rom/.idea/archive-rom.iml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.9 (archive-rom)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
12
archive-rom/.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
12
archive-rom/.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@ -0,0 +1,12 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoredIdentifiers">
|
||||
<list>
|
||||
<option value="list.__getitem__" />
|
||||
</list>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
11
archive-rom/.idea/misc.xml
generated
Normal file
11
archive-rom/.idea/misc.xml
generated
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.9 (archive-rom)" />
|
||||
</component>
|
||||
<component name="DiscordProjectSettings">
|
||||
<option name="show" value="ASK" />
|
||||
<option name="description" value="" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (archive-rom)" project-jdk-type="Python SDK" />
|
||||
</project>
|
8
archive-rom/.idea/modules.xml
generated
Normal file
8
archive-rom/.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/archive-rom.iml" filepath="$PROJECT_DIR$/.idea/archive-rom.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
60
archive-rom/download-urls.py
Normal file
60
archive-rom/download-urls.py
Normal file
@ -0,0 +1,60 @@
|
||||
import os
|
||||
import sys
|
||||
import requests
|
||||
import humanize
|
||||
from urllib.parse import unquote
|
||||
|
||||
|
||||
def parse_file(file_name):
|
||||
urls = []
|
||||
with open(file_name, 'r') as f:
|
||||
for line in f:
|
||||
urls.append(unquote(line.strip()))
|
||||
return urls
|
||||
|
||||
|
||||
def get_filename(url):
|
||||
return url.split('/')[-1]
|
||||
|
||||
|
||||
def print_progress(amount_written, file_size, sizes):
|
||||
for size in sizes:
|
||||
if amount_written >= size:
|
||||
sizes.remove(size)
|
||||
percentage = (10 - len(sizes)) * 10
|
||||
print(f"{percentage}% Written {humanize.naturalsize(amount_written)} / {humanize.naturalsize(file_size)}")
|
||||
return sizes
|
||||
|
||||
|
||||
def download_url(url, filename):
|
||||
# Constant
|
||||
temp_file = filename + ".tmp"
|
||||
chunk_size = 1024 * 1024 * 8 # 8MB
|
||||
# Request
|
||||
r = requests.get(url, stream=True)
|
||||
# More constants
|
||||
file_size = int(r.headers.get('Content-Length'))
|
||||
sizes = [file_size * (i / 100) for i in range(0, 101, 10)] # 101, because range is exclusive lmao
|
||||
# Statistics
|
||||
amount_written = 0
|
||||
with open(temp_file, 'wb') as f:
|
||||
for chunk in r.iter_content(chunk_size=chunk_size):
|
||||
if chunk:
|
||||
f.write(chunk)
|
||||
amount_written += chunk_size
|
||||
sizes = print_progress(amount_written, file_size, sizes)
|
||||
# Rename
|
||||
os.rename(temp_file, filename)
|
||||
|
||||
|
||||
def main():
|
||||
file = sys.argv[1]
|
||||
urls = parse_file(file)
|
||||
for url in urls:
|
||||
filename = get_filename(url)
|
||||
print(f"Downloading {filename}")
|
||||
download_url(url, filename)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
2
archive-rom/run.ps1
Normal file
2
archive-rom/run.ps1
Normal file
@ -0,0 +1,2 @@
|
||||
.\venv\Scripts\activate.ps1
|
||||
python .\download-urls.py .\urls.txt
|
5
archive-rom/todo.url
Normal file
5
archive-rom/todo.url
Normal file
@ -0,0 +1,5 @@
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,11
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=https://stackoverflow.com/questions/62007674/multi-thread-requests-python3
|
36
archive-rom/urls.txt
Normal file
36
archive-rom/urls.txt
Normal file
@ -0,0 +1,36 @@
|
||||
https://archive.org/download/wii_rvz_usa/wii_rvz_usa/Animal%20Crossing%20-%20City%20Folk%20%28USA%2C%20Asia%29%20%28En%2CFr%2CEs%29%20%28Rev%201%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa/wii_rvz_usa/Donkey%20Kong%20-%20Barrel%20Blast%20%28USA%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa/wii_rvz_usa/Donkey%20Kong%20Country%20Returns%20%28USA%29%20%28En%2CFr%2CEs%29%20%28Rev%201%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p2/wii_rvz_usa/GoldenEye%20007%20%28USA%29%20%28En%2CFr%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p2/wii_rvz_usa/Kirby%27s%20Dream%20Collection%20-%20Special%20Edition%20%28USA%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p2/wii_rvz_usa/Kirby%27s%20Epic%20Yarn%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p2/wii_rvz_usa/Kirby%27s%20Return%20to%20Dream%20Land%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p2/wii_rvz_usa/Last%20Story%2C%20The%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p2/wii_rvz_usa/Legend%20of%20Zelda%2C%20The%20-%20Skyward%20Sword%20%28USA%29%20%28En%2CFr%2CEs%29%20%28Rev%202%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p2/wii_rvz_usa/Legend%20of%20Zelda%2C%20The%20-%20Twilight%20Princess%20%28USA%29%20%28En%2CFr%2CEs%29%20%28Rev%202%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p2/wii_rvz_usa/Mario%20Kart%20Wii%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/New%20Super%20Mario%20Bros.%20Wii%20%28USA%29%20%28En%2CFr%2CEs%29%20%28Rev%202%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/No%20More%20Heroes%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/No%20More%20Heroes%202%20-%20Desperate%20Struggle%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Ookami%20%28USA%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Pikmin%202%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Pokemon%20Battle%20Revolution%20%28USA%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Punch-Out%21%21%20%28USA%29%20%28En%2CFr%2CEs%29%20%28Rev%201%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Rhythm%20Heaven%20Fever%20%28USA%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Super%20Mario%20All-Stars%20%28USA%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Super%20Mario%20Galaxy%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Super%20Mario%20Galaxy%202%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Super%20Paper%20Mario%20%28USA%29%20%28Rev%202%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p3/wii_rvz_usa/Super%20Smash%20Bros.%20Brawl%20%28USA%29%20%28Rev%202%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Wario%20Land%20-%20Shake%20It%21%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/WarioWare%20-%20Smooth%20Moves%20%28USA%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Wii%20Music%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Wii%20Party%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Wii%20Play%20%28USA%29%20%28Rev%201%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Wii%20Sports%20%28USA%29%20%28Rev%201%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Wii%20Sports%20Resort%20%28USA%29%20%28En%2CFr%2CEs%29%20%28Rev%201%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Wii%20Sports%20%2B%20Wii%20Sports%20Resort%20%28USA%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Xenoblade%20Chronicles%20%28USA%2C%20Asia%29%20%28En%2CFr%2CEs%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Trauma%20Center%20-%20New%20Blood%20%28USA%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Trauma%20Center%20-%20Second%20Opinion%20%28USA%29.rvz
|
||||
https://archive.org/download/wii_rvz_usa_p4/wii_rvz_usa/Trauma%20Team%20%28USA%29.rvz
|
17
convert-rvz-wbfs/convert.ps1
Normal file
17
convert-rvz-wbfs/convert.ps1
Normal file
@ -0,0 +1,17 @@
|
||||
# Converts all rvz files in the current directory to wbfs files
|
||||
# Warning: Removes the RVZ files after conversion if the -r argument is passed
|
||||
# Requires: dolphintool, wit
|
||||
|
||||
$files = Get-ChildItem -Filter *.rvz .
|
||||
foreach ($file in $files) {
|
||||
$name = $file.BaseName
|
||||
$rvz = $name + ".rvz"
|
||||
$iso = $name + ".iso"
|
||||
$wbfs = $name + ".wbfs"
|
||||
dolphintool convert -i $rvz -o $iso -f iso
|
||||
if ($args[0] -eq "-r") {
|
||||
Remove-Item $rvz
|
||||
}
|
||||
wit copy -B $iso $wbfs
|
||||
Remove-Item $iso
|
||||
}
|
4
hq2cd-ps1/TODO.txt
Normal file
4
hq2cd-ps1/TODO.txt
Normal file
@ -0,0 +1,4 @@
|
||||
Need to normalize file names on server, no stupid "’" and "'" shenanigans
|
||||
https://apps.timwhitlock.info/unicode/inspect?s=%E2%80%99%27
|
||||
|
||||
either that or get child item to not print out something different than what is actually there
|
50
hq2cd-ps1/convert-from-file.ps1
Normal file
50
hq2cd-ps1/convert-from-file.ps1
Normal file
@ -0,0 +1,50 @@
|
||||
# Delete output folder if it exists
|
||||
if (Test-Path -Path "Output") {
|
||||
Remove-Item -Path "Output" -Recurse -Force
|
||||
}
|
||||
|
||||
# Read each line in the file
|
||||
$filePaths = Get-Content -Path $args[0]
|
||||
|
||||
# Save to output folder "Output"
|
||||
$destination = "Output"
|
||||
if (-not (Test-Path -Path $destination)) {
|
||||
New-Item -Path $destination -ItemType Directory
|
||||
}
|
||||
|
||||
# Now use ffmpeg to convert each file to 16-bit 44.1kHz
|
||||
<# This is the old way, use the new way below using -Parallel
|
||||
foreach ($file in $files) {
|
||||
$destinationPath = $destination + "\" + $file.Name
|
||||
ffmpeg -i $file.FullName -c:a flac -sample_fmt s16 -ar 44100 $destinationPath
|
||||
}
|
||||
#>
|
||||
|
||||
$filePaths | ForEach-Object -Parallel {
|
||||
# Stupid apostrophe in the file name
|
||||
# Intentional, as this is how Picard names files with apostrophes
|
||||
$path = $_.Replace("'", "’")
|
||||
|
||||
$file = Get-Item -LiteralPath $path
|
||||
|
||||
$destination = "Output"
|
||||
$prefix = "Z:\Music-HQ\"
|
||||
|
||||
|
||||
|
||||
$oldLocation = $file.FullName
|
||||
# Remove the prefix
|
||||
$newLocation = $oldLocation.Substring($prefix.Length)
|
||||
# Remove the name of the file for folder creation
|
||||
$newLocation = $newLocation.Substring(0, $newLocation.IndexOf($file.Name))
|
||||
|
||||
# Create the folder if it doesn't exist
|
||||
if (-not (Test-Path -Path $destination\$newLocation)) {
|
||||
New-Item -Path $destination\$newLocation -ItemType Directory
|
||||
}
|
||||
$destinationPath = $destination + "\" + $newLocation + $file.Name
|
||||
|
||||
Write-Host $destinationPath
|
||||
|
||||
ffmpeg -i $_.FullName -c:a flac -sample_fmt s16 -ar 44100 $destinationPath
|
||||
}
|
40
hq2cd-ps1/get-paths.ps1
Normal file
40
hq2cd-ps1/get-paths.ps1
Normal file
@ -0,0 +1,40 @@
|
||||
# From the current folder, make a powershell array that finds all files with the .flac extension and add them to a list
|
||||
|
||||
# Get all files with the .flac extension
|
||||
$files = Get-ChildItem -Path . -Filter *.flac -Recurse
|
||||
|
||||
# Write-Host "Found" $files.Count "files"
|
||||
|
||||
# For each file, run ffprobe with json ouptut, and include it in a new list if it has a sample rate above 44100, and a bit depth above 16
|
||||
|
||||
<# This is the old way, use the new way below using -Parallel
|
||||
foreach ($file in $files) {
|
||||
$ffprobe = ffprobe -v quiet -print_format json -show_format -show_streams $file.FullName
|
||||
$ffprobe = $ffprobe | ConvertFrom-Json
|
||||
$stream = $ffprobe.streams | Where-Object {$_.codec_name -eq "flac"}
|
||||
|
||||
if ($stream.sample_rate -gt 44100 -or $stream.bits_per_raw_sample -gt 16) {
|
||||
Write-Host $file.FullName
|
||||
$hq += $file
|
||||
}
|
||||
}
|
||||
#>
|
||||
|
||||
$hq = @()
|
||||
$files | ForEach-Object -Parallel {
|
||||
$ffprobe = ffprobe -v quiet -print_format json -show_format -show_streams $_.FullName
|
||||
$ffprobe = $ffprobe | ConvertFrom-Json
|
||||
$stream = $ffprobe.streams | Where-Object {$_.codec_name -eq "flac"}
|
||||
|
||||
if ($stream.sample_rate -gt 44100 -or $stream.bits_per_raw_sample -gt 16) {
|
||||
Write-Host $_.FullName
|
||||
$hq += $_
|
||||
}
|
||||
}
|
||||
|
||||
# Doesn't work, so use input redirection instead "script.ps1 *> input.txt" because of read host, or "(pwsh -c script.ps1) > hq.txt"
|
||||
# Save each file in hq to a text file with its full path
|
||||
# New-Item -Path . -Name hq.txt -ItemType File -Quiet
|
||||
# foreach ($file in $hq) {
|
||||
# $file.FullName | Out-File -FilePath hq.txt -Append
|
||||
# }
|
791
hq2cd-ps1/old/to_redownload.txt
Normal file
791
hq2cd-ps1/old/to_redownload.txt
Normal file
@ -0,0 +1,791 @@
|
||||
100 gecs - 10,000 gecs
|
||||
100 gecs - 100 gecs
|
||||
100 gecs - 1000 gecs
|
||||
100 gecs - 1000 gecs and The Tree of Clues
|
||||
100 gecs - Snake Eyes
|
||||
AJJ - Can't Maintain
|
||||
AJJ - Candy Cigarettes, Capguns, Issue Problems! and Such
|
||||
AJJ - Christmas Island
|
||||
AJJ - Good Luck Everybody
|
||||
AJJ - Knife Man
|
||||
AJJ - People Who Can Eat People Are the Luckiest People in the World
|
||||
AJJ - The Bible 2
|
||||
American Football - American Football
|
||||
American Football - American Football (LP2)
|
||||
American Football - American Football (LP3)
|
||||
American Football - American Football EP
|
||||
Anamanaguchi - Capsule Silence XXIV Original Soundtrack
|
||||
Anamanaguchi - Capsule Silence XXIV Original Soundtrack, Vol. II
|
||||
Anamanaguchi - Dawn Metropolis
|
||||
Anamanaguchi - Endless Fantasy
|
||||
Anamanaguchi - Power Supply
|
||||
Anamanaguchi - Scott Pilgrim vs. the World_ The Game (Original Videogame Soundtrack)
|
||||
Aperture Science Psychoacoustic Laboratories - Portal 2_ Songs to Test By (Collectors Edition)
|
||||
Aphex Twin - …I Care Because You Do
|
||||
Aphex Twin - Drukqs
|
||||
Aphex Twin - Richard D. James Album
|
||||
Aphex Twin - Selected Ambient Works 85–92
|
||||
Aphex Twin - Selected Ambient Works, Volume II
|
||||
Aphex Twin - Syro
|
||||
aphextwinsucks x rehirable x Temma - sunday syndrome
|
||||
Arctic Monkeys - AM
|
||||
Arctic Monkeys - Favourite Worst Nightmare
|
||||
Arctic Monkeys - Humbug
|
||||
Arctic Monkeys - Suck It and See
|
||||
Arctic Monkeys - The Car
|
||||
Arctic Monkeys - Tranquility Base Hotel & Casino
|
||||
Arctic Monkeys - Whatever People Say I Am, That’s What I’m Not
|
||||
Beach House - 7
|
||||
Beach House - Beach House
|
||||
Beach House - Bloom
|
||||
Beach House - Depression Cherry
|
||||
Beach House - Devotion
|
||||
Beach House - Once Twice Melody
|
||||
Beach House - Teen Dream
|
||||
Beach House - Thank Your Lucky Stars
|
||||
Beck - Colors
|
||||
Beck - Guero
|
||||
Beck - Hyperspace
|
||||
Beck - Mellow Gold
|
||||
Beck - Midnite Vultures
|
||||
Beck - Modern Guilt
|
||||
Beck - Morning Phase
|
||||
Beck - Mutations
|
||||
Beck - Odelay
|
||||
Beck - One Foot in the Grave
|
||||
Beck - Sea Change
|
||||
Beck - Stereopathetic Soulmanure
|
||||
Beck - The Information
|
||||
Ben Folds - Rockin’ the Suburbs
|
||||
Ben Folds - So There
|
||||
Ben Folds - Songs for Silverman
|
||||
Ben Folds - Way to Normal
|
||||
Ben Folds Five - Ben Folds Five
|
||||
Ben Folds Five - The Sound of the Life of the Mind
|
||||
Ben Folds Five - The Unauthorized Biography of Reinhold Messner
|
||||
Ben Folds Five - Whatever and Ever Amen
|
||||
bill wurtz - 9 8 7
|
||||
bill wurtz - at the corner store
|
||||
bill wurtz - fly around
|
||||
bill wurtz - i like to wear soft clothing (cause it makes me feel like i'm rough in comparison)
|
||||
bill wurtz - i'm a huge gamer most of the time
|
||||
bill wurtz - i’m scared
|
||||
bill wurtz - if the world doesn't end
|
||||
bill wurtz - meet me in september
|
||||
bill wurtz - more than a dream
|
||||
bill wurtz - the ending
|
||||
bill wurtz - the ground plane
|
||||
bill wurtz - where i've been
|
||||
Billie Eilish - Happier Than Ever
|
||||
Billie Eilish - WHEN WE ALL FALL ASLEEP, WHERE DO WE GO_
|
||||
Billy Joel - 52nd Street
|
||||
Billy Joel - An Innocent Man
|
||||
Billy Joel - Cold Spring Harbor
|
||||
Billy Joel - Glass Houses
|
||||
Billy Joel - Piano Man
|
||||
Billy Joel - River of Dreams
|
||||
Billy Joel - Storm Front
|
||||
Billy Joel - Streetlife Serenade
|
||||
Billy Joel - The Bridge
|
||||
Billy Joel - The Nylon Curtain
|
||||
Billy Joel - The Stranger
|
||||
Billy Joel - Turnstiles
|
||||
Billy Joel; Hyung‐ki Joo - Fantasies & Delusions, op. 1-10_ Music for Solo Piano
|
||||
Black Sabbath - 13
|
||||
Black Sabbath - Black Sabbath
|
||||
Black Sabbath - Born Again
|
||||
Black Sabbath - Dehumanizer
|
||||
Black Sabbath - Heaven and Hell
|
||||
Black Sabbath - Master of Reality
|
||||
Black Sabbath - Mob Rules
|
||||
Black Sabbath - Never Say Die!
|
||||
Black Sabbath - Paranoid
|
||||
Black Sabbath - Sabbath Bloody Sabbath
|
||||
Black Sabbath - Sabotage
|
||||
Black Sabbath - Technical Ecstasy
|
||||
Black Sabbath - The Eternal Idol
|
||||
Black Sabbath - Vol 4
|
||||
Black Sabbath featuring Tony Iommi - Seventh Star
|
||||
blink‐182 - blink‐182
|
||||
blink‐182 - Buddha
|
||||
blink‐182 - Cheshire Cat
|
||||
blink‐182 - Dogs Eating Dogs
|
||||
blink‐182 - Dude Ranch
|
||||
blink‐182 - Enema of the State
|
||||
blink‐182 - Neighborhoods
|
||||
blink‐182 - NINE
|
||||
blink‐182 - Take Off Your Pants and Jacket
|
||||
Boingo - Boingo
|
||||
Brand New - Daisy
|
||||
Brand New - Deja Entendu
|
||||
Brand New - Science Fiction
|
||||
Brand New - The Devil and God Are Raging Inside Me
|
||||
Brand New - Your Favorite Weapon
|
||||
C418 - Cookie Clicker
|
||||
C418 - Excursions
|
||||
C418 - Minecraft – Volume Alpha
|
||||
C418 - Minecraft – Volume Beta
|
||||
Cage The Elephant - Cage the Elephant
|
||||
Cage The Elephant - Melophobia
|
||||
Cage The Elephant - Social Cues
|
||||
Cage The Elephant - Tell Me I’m Pretty
|
||||
Cage The Elephant - Thank You, Happy Birthday
|
||||
Car Seat Headrest - Twin Fantasy
|
||||
Caravan Palace - __°_°__
|
||||
Caravan Palace - Caravan Palace
|
||||
Caravan Palace - Chronologic
|
||||
Caravan Palace - Panic
|
||||
Carpenter Brut - Trilogy
|
||||
Cavetown - 16_04_16
|
||||
Cavetown - Animal Kingdom
|
||||
Cavetown - Cavetown
|
||||
Cavetown - Lemon Boy
|
||||
Cavetown - Man’s Best Friend
|
||||
Cavetown - Sleepyhead
|
||||
Cavetown - worm food
|
||||
Cojum Dip - Cojum Dip
|
||||
Daft Punk - Discovery
|
||||
Daft Punk - Homework
|
||||
Daft Punk - Human After All
|
||||
Daft Punk - Random Access Memories
|
||||
Daft Punk - Random Access Memories (10th anniversary edition)
|
||||
David Bowie - ‘hours…’
|
||||
David Bowie - “Heroes”
|
||||
David Bowie - ★
|
||||
David Bowie - 1.Outside_ The Nathan Adler Diaries_ A Hyper Cycle
|
||||
David Bowie - Aladdin Sane
|
||||
David Bowie - Black Tie White Noise
|
||||
David Bowie - David Bowie
|
||||
David Bowie - David Bowie (aka Space Oddity)
|
||||
David Bowie - Diamond Dogs
|
||||
David Bowie - Earthling
|
||||
David Bowie - Heathen
|
||||
David Bowie - Hunky Dory
|
||||
David Bowie - Let’s Dance
|
||||
David Bowie - Lodger
|
||||
David Bowie - Low
|
||||
David Bowie - Never Let Me Down
|
||||
David Bowie - PinUps
|
||||
David Bowie - Reality
|
||||
David Bowie - Scary Monsters… and Super Creeps
|
||||
David Bowie - Station to Station
|
||||
David Bowie - The Buddha of Suburbia
|
||||
David Bowie - The Man Who Sold the World
|
||||
David Bowie - The Next Day
|
||||
David Bowie - The Rise and Fall of Ziggy Stardust and the Spiders From Mars
|
||||
David Bowie - Tonight
|
||||
David Bowie - Toy (Toy_Box)
|
||||
David Bowie - Young Americans
|
||||
Davy's Grey - No Cigar
|
||||
Death Grips - Bottomless Pit
|
||||
Death Grips - Fashion Week (instrumentals)
|
||||
Death Grips - Government Plates
|
||||
Death Grips - Interview 2016
|
||||
Death Grips - No Love Deep Web
|
||||
Death Grips - The Money Store
|
||||
Death Grips - The Powers That B
|
||||
Death Grips - Year of the Snitch
|
||||
Deftones - Adrenaline
|
||||
Deftones - Around the Fur
|
||||
Deftones - Deftones
|
||||
Deftones - Diamond Eyes
|
||||
Deftones - Gore
|
||||
Deftones - Koi no Yokan
|
||||
Deftones - Ohms
|
||||
Deftones - Saturday Night Wrist
|
||||
Deftones - White Pony
|
||||
DOOM - Born Like This
|
||||
Dryjacket - For Posterity
|
||||
Dryjacket - Going Out of Business
|
||||
Dryjacket - Lights, Locks, & Faucets
|
||||
Fall Out Boy - American Beauty _ American Psycho
|
||||
Fall Out Boy - Folie à deux
|
||||
Fall Out Boy - From Under the Cork Tree
|
||||
Fall Out Boy - Infinity on High
|
||||
Fall Out Boy - M A N I A
|
||||
Fall Out Boy - My Heart Will Always Be the B-Side to My Tongue
|
||||
Fall Out Boy - Save Rock and Roll
|
||||
Fall Out Boy - So Much (for) Stardust
|
||||
Fall Out Boy - Take This to Your Grave
|
||||
Fearofdark - Dr Kobushi's Labyrinthine Laboratory (Original Soundtrack)
|
||||
Fearofdark - Exit Plan
|
||||
Fearofdark - Motorway
|
||||
Feed Me Jack - Anatolia
|
||||
Feed Me Jack - Chumpfrey
|
||||
Feed Me Jack - Covers
|
||||
Feed Me Jack - Ultra Ego
|
||||
fun_ - Aim and Ignite
|
||||
fun_ - Some Nights
|
||||
Ghost - Ghost
|
||||
Ghost - Hypnotic Underworld
|
||||
Ghost - IMPERA
|
||||
Ghost - In Stormy Nights
|
||||
Ghost - Infestissumam
|
||||
Ghost - Lama Rabi Rabi
|
||||
Ghost - Meliora
|
||||
Ghost - Opus Eponymous
|
||||
Ghost - Popestar
|
||||
Ghost - Prequelle
|
||||
Ghost - Second Time Around
|
||||
Ghost - Snuffbox Immanence
|
||||
Ghost - Temple Stone
|
||||
Ghost - Tune In, Turn On, Free Tibet
|
||||
glass beach - the first glass beach album
|
||||
Gorillaz - Cracker Island
|
||||
Gorillaz - Demon Days
|
||||
Gorillaz - Gorillaz
|
||||
Gorillaz - Humanz
|
||||
Gorillaz - Plastic Beach
|
||||
Gorillaz - Song Machine, Season One_ Strange Timez (Deluxe)
|
||||
Gorillaz - The Fall
|
||||
Gorillaz - The Now Now
|
||||
Gotye - Boardface
|
||||
Gotye - Like Drawing Blood
|
||||
Gotye - Making Mirrors
|
||||
Graham Kartna - _temp
|
||||
Graham Kartna - An Obsession With Kit
|
||||
Graham Kartna - Children's Music For Big Kids
|
||||
Graham Kartna - Drain
|
||||
Graham Kartna - Ideation Deluxe
|
||||
Graham Kartna - Laker Ice EP
|
||||
Graham Kartna - Loop Tube
|
||||
Graham Kartna - Rewards
|
||||
Graham Kartna - Rhetoric On Sublime
|
||||
Graham Kartna - Shoot The Moons
|
||||
Graham Kartna - These Are the Shout
|
||||
Graham Kartna - TMP2
|
||||
Graham Kartna - Toot Toot
|
||||
Green Day - 21st Century Breakdown
|
||||
Green Day - American Idiot
|
||||
Green Day - Dookie
|
||||
Green Day - Father of All Motherfuckers
|
||||
Green Day - Insomniac
|
||||
Green Day - Kerplunk!
|
||||
Green Day - nimrod_
|
||||
Green Day - Revolution Radio
|
||||
Green Day - Uno...Dos...Tré!
|
||||
Green Day - Warning_
|
||||
Harry Callaghan - Portal Stories_ Mel Soundtrack
|
||||
Her’s - Invitation to Her’s
|
||||
Her’s - Songs of Her’s
|
||||
HOME - Before the Night
|
||||
HOME - Falling Into Place
|
||||
HOME - Odyssey
|
||||
HOME - Resting State
|
||||
I DONT KNOW HOW BUT THEY FOUND ME - 1981 Extended Play
|
||||
I DONT KNOW HOW BUT THEY FOUND ME - RAZZMATAZZ
|
||||
Interpol - Turn On the Bright Lights
|
||||
Jack Stauber - Finite Form
|
||||
Jack Stauber - HiLo
|
||||
Jack Stauber - Micropop
|
||||
Jack Stauber - Pop Food
|
||||
Jack Stauber - Viator
|
||||
Jack Stauber's Micropop - Shop_ A Pop Opera
|
||||
JAY‐Z & Kanye West - Watch the Throne
|
||||
Jeff Rosenstock - NO DREAM
|
||||
Jeff Rosenstock - POST‐
|
||||
Jeff Rosenstock - SKA DREAM
|
||||
Jeff Rosenstock - We Cool_
|
||||
Jeff Rosenstock - WORRY_
|
||||
Jeremy Soule - The Elder Scrolls IV_ Oblivion (Original Game Soundtrack)
|
||||
Jeremy Soule - The Elder Scrolls V_ Skyrim
|
||||
Joe Hawley - Joe Hawley Joe Hawley
|
||||
Jukebox the Ghost - Cheers
|
||||
Jukebox the Ghost - Everything Under the Sun
|
||||
Jukebox the Ghost - Jukebox the Ghost
|
||||
Jukebox the Ghost - Let Live & Let Ghosts
|
||||
Jukebox the Ghost - Off to the Races
|
||||
Jukebox the Ghost - Safe Travels
|
||||
Justice - Justice
|
||||
Kanye West - 808s & Heartbreak
|
||||
Kanye West - Donda
|
||||
Kanye West - Graduation
|
||||
Kanye West - Jesus Is King
|
||||
Kanye West - Late Registration
|
||||
Kanye West - My Beautiful Dark Twisted Fantasy
|
||||
Kanye West - The College Dropout
|
||||
Kanye West - The Life of Pablo
|
||||
Kanye West - ye
|
||||
Kanye West - Yeezus
|
||||
Kavinsky - OutRun
|
||||
Kavinsky - Reborn
|
||||
Kendrick Lamar - DAMN_
|
||||
Kendrick Lamar - good kid, m.A.A.d city
|
||||
Kendrick Lamar - Mr. Morale & the Big Steppers
|
||||
Kendrick Lamar - Section.80
|
||||
Kendrick Lamar - To Pimp a Butterfly
|
||||
Kero Kero Bonito - Bonito Generation
|
||||
Kero Kero Bonito - Civilisation
|
||||
Kero Kero Bonito - Intro Bonito
|
||||
Kero Kero Bonito - Time ’n’ Place
|
||||
KIDS SEE GHOSTS - KIDS SEE GHOSTS
|
||||
King Crimson - Beat
|
||||
King Crimson - Discipline
|
||||
King Crimson - In the Court of the Crimson King
|
||||
King Crimson - In the Wake of Poseidon
|
||||
King Crimson - Islands
|
||||
King Crimson - Larks’ Tongues in Aspic
|
||||
King Crimson - Lizard
|
||||
King Crimson - Red
|
||||
King Crimson - Starless and Bible Black
|
||||
King Crimson - The ConstruKction of Light
|
||||
King Crimson - The Power to Believe
|
||||
King Crimson - THRAK
|
||||
King Crimson - Three of a Perfect Pair
|
||||
King Geedorah - Take Me to Your Leader
|
||||
King Gizzard & The Lizard Wizard - 12 Bar Bruise
|
||||
King Gizzard & The Lizard Wizard - Butterfly 3000
|
||||
King Gizzard & The Lizard Wizard - Changes
|
||||
King Gizzard & The Lizard Wizard - Eyes Like the Sky
|
||||
King Gizzard & The Lizard Wizard - Fishing for Fishies
|
||||
King Gizzard & The Lizard Wizard - Float Along – Fill Your Lungs
|
||||
King Gizzard & The Lizard Wizard - Flying Microtonal Banana
|
||||
King Gizzard & The Lizard Wizard - Gumboot Soup
|
||||
King Gizzard & The Lizard Wizard - I’m in Your Mind Fuzz
|
||||
King Gizzard & The Lizard Wizard - Ice, Death, Planets, Lungs, Mushrooms and Lava
|
||||
King Gizzard & The Lizard Wizard - K.G_
|
||||
King Gizzard & The Lizard Wizard - L.W_
|
||||
King Gizzard & The Lizard Wizard - Laminated Denim
|
||||
King Gizzard & The Lizard Wizard - Made in Timeland
|
||||
King Gizzard & The Lizard Wizard - Nonagon Infinity
|
||||
King Gizzard & The Lizard Wizard - Oddments
|
||||
King Gizzard & The Lizard Wizard - Omnium Gatherum
|
||||
King Gizzard & The Lizard Wizard - Paper Mâché Dream Balloon
|
||||
King Gizzard & The Lizard Wizard - Polygondwanaland
|
||||
King Gizzard & The Lizard Wizard - Quarters!
|
||||
King Gizzard & The Lizard Wizard - Sketches of Brunswick East
|
||||
King Gizzard & The Lizard Wizard - Willoughby’s Beach
|
||||
Laura Shigihara - Plants vs. Zombies Original Soundtrack
|
||||
Laura Shigihara - shigi lofi, vol. 1
|
||||
Led Zeppelin - Houses of the Holy
|
||||
Led Zeppelin - In Through the Out Door
|
||||
Led Zeppelin - Led Zeppelin
|
||||
Led Zeppelin - Led Zeppelin II
|
||||
Led Zeppelin - Led Zeppelin III
|
||||
Led Zeppelin - Physical Graffiti
|
||||
Led Zeppelin - Presence
|
||||
Lemon Demon - Damn Skippy
|
||||
Lemon Demon - Dinosaurchestra
|
||||
Lemon Demon - I Am Become Christmas
|
||||
Lemon Demon - Nature Tapes EP
|
||||
Lemon Demon - Spirit Phone
|
||||
Lemon Demon - View-monster
|
||||
Madvillain - Madvillainy
|
||||
Matt Maltese - Bad Contestant
|
||||
Matt Maltese - Good Morning It’s Now Tomorrow
|
||||
Matt Maltese - Krystal
|
||||
Metallica - …And Justice for All
|
||||
Metallica - 72 Seasons
|
||||
Metallica - Death Magnetic
|
||||
Metallica - Hardwired…to Self‐Destruct
|
||||
Metallica - Kill ’Em All
|
||||
Metallica - Load
|
||||
Metallica - Master of Puppets
|
||||
Metallica - Metallica (Remastered 2021)
|
||||
Metallica - Reload
|
||||
Metallica - Ride The Lightning
|
||||
Metallica - St. Anger
|
||||
MF DOOM - MM..FOOD
|
||||
MF DOOM - Operation_ Doomsday
|
||||
MGMT - 11•11•11
|
||||
MGMT - Congratulations
|
||||
MGMT - Little Dark Age
|
||||
MGMT - MGMT
|
||||
MGMT - Oracular Spectacular
|
||||
MGMT - Time to Pretend
|
||||
Michael Jackson - Bad
|
||||
Michael Jackson - Dangerous
|
||||
Michael Jackson - Off the Wall
|
||||
Michael Jackson - Thriller
|
||||
Michael Jackson - Xscape
|
||||
Michael John Gordon - Wolfenstein_ The New Order Original Game Soundtrack
|
||||
Mick Gordon - DOOM (Original Game Soundtrack)
|
||||
Mild High Club - Skiptracing
|
||||
Mk III - Oh No, It's the End of the World
|
||||
Modest Mouse - Good News for People Who Love Bad News
|
||||
Modest Mouse - Strangers to Ourselves
|
||||
Modest Mouse - The Golden Casket
|
||||
Modest Mouse - The Lonesome Crowded West
|
||||
Modest Mouse - The Moon & Antarctica
|
||||
Modest Mouse - This Is a Long Drive for Someone With Nothing to Think About
|
||||
Modest Mouse - We Were Dead Before the Ship Even Sank
|
||||
Mr.Kitty - Time
|
||||
Mudeth - Antibirth_ OST
|
||||
My Chemical Romance - Danger Days_ The True Lives of the Fabulous Killjoys
|
||||
My Chemical Romance - I Brought You My Bullets, You Brought Me Your Love
|
||||
My Chemical Romance - The Black Parade
|
||||
My Chemical Romance - Three Cheers for Sweet Revenge
|
||||
Neil Cicierega - Mouth Dreams
|
||||
Neil Cicierega - Mouth Moods
|
||||
Neil Cicierega - Mouth Silence
|
||||
Neil Cicierega - Mouth Sounds
|
||||
nelward - 20XX
|
||||
nelward - Alive In Screen
|
||||
nelward - Eat Your Dreams
|
||||
nelward - GiraffEP
|
||||
nelward - Lucid Scream
|
||||
Neutral Milk Hotel - Everything Is
|
||||
Neutral Milk Hotel - Ferris Wheel on Fire
|
||||
Neutral Milk Hotel - In the Aeroplane Over the Sea
|
||||
Neutral Milk Hotel - On Avery Island
|
||||
Nine Inch Nails - Add Violence
|
||||
Nine Inch Nails - Bad Witch
|
||||
Nine Inch Nails - Broken
|
||||
Nine Inch Nails - Further Down the Spiral
|
||||
Nine Inch Nails - Ghosts I–IV
|
||||
Nine Inch Nails - Ghosts V_ Together
|
||||
Nine Inch Nails - Ghosts VI_ Locusts
|
||||
Nine Inch Nails - Hesitation Marks
|
||||
Nine Inch Nails - March of the Pigs
|
||||
Nine Inch Nails - Not the Actual Events
|
||||
Nine Inch Nails - Pretty Hate Machine
|
||||
Nine Inch Nails - Quake
|
||||
Nine Inch Nails - Still
|
||||
Nine Inch Nails - The Downward Spiral (deluxe edition)
|
||||
Nine Inch Nails - The Fragile
|
||||
Nine Inch Nails - The Slip
|
||||
Nine Inch Nails - With Teeth
|
||||
Nine Inch Nails - Year Zero
|
||||
Nirvana - Bleach
|
||||
Nirvana - In Utero
|
||||
Nirvana - Nevermind
|
||||
Oingo Boingo - Best O’ Boingo
|
||||
Oingo Boingo - Boi-Ngo
|
||||
Oingo Boingo - Dark at the End of the Tunnel
|
||||
Oingo Boingo - Dead Man’s Party
|
||||
Oingo Boingo - Good for Your Soul
|
||||
Oingo Boingo - Nothing to Fear
|
||||
Oingo Boingo - Only a Lad
|
||||
OK Glass - Can't Turn It Off
|
||||
OK Glass - Sand (and other mysteries)
|
||||
OK Go - Hungry Ghosts
|
||||
OK Go - Of the Blue Colour of the Sky
|
||||
OK Go - Oh No
|
||||
OK Go - OK Go
|
||||
Origami Angel - DEPART
|
||||
Origami Angel - Doing the Most
|
||||
Origami Angel - GAMI GANG
|
||||
Origami Angel - Gen 3
|
||||
Origami Angel - Holy Split
|
||||
Origami Angel - Origami Angel Broke Minecraft
|
||||
Origami Angel - Quiet Hours
|
||||
Origami Angel - re_ turn
|
||||
Origami Angel - Somewhere City
|
||||
Origami Angel - The Brightest Days
|
||||
Ozma - Boomtown
|
||||
Ozma - Pasadena
|
||||
Ozma - Spending Time on the Borderline
|
||||
Ozma - The Doubble Donkey Disc
|
||||
Panic! at the Disco - A Fever You Can’t Sweat Out
|
||||
Panic! at the Disco - Death of a Bachelor
|
||||
Panic! at the Disco - Pray for the Wicked
|
||||
Panic! at the Disco - Pretty. Odd_
|
||||
Panic! at the Disco - Too Weird to Live, Too Rare to Die!
|
||||
Panic! at the Disco - Vices & Virtues
|
||||
Panic! at the Disco - Viva las Vengeance
|
||||
Paramore - After Laughter
|
||||
Paramore - All We Know Is Falling
|
||||
Paramore - brand new eyes
|
||||
Paramore - Paramore
|
||||
Paramore - RIOT!
|
||||
Paramore - This Is Why
|
||||
Pearl Jam - Backspacer
|
||||
Pearl Jam - Binaural
|
||||
Pearl Jam - Gigaton
|
||||
Pearl Jam - Lightning Bolt
|
||||
Pearl Jam - No Code
|
||||
Pearl Jam - Pearl Jam
|
||||
Pearl Jam - Riot Act
|
||||
Pearl Jam - Ten
|
||||
Pearl Jam - Vitalogy
|
||||
Pearl Jam - Vs_
|
||||
Pearl Jam - Yield
|
||||
Pinegrove - 11_11
|
||||
Pinegrove - Cardinal
|
||||
Pinegrove - Everything So Far
|
||||
Pinegrove - Marigold
|
||||
Pinegrove - Skylight
|
||||
Pink Floyd - A Momentary Lapse of Reason
|
||||
Pink Floyd - A Saucerful of Secrets
|
||||
Pink Floyd - Animals
|
||||
Pink Floyd - Atom Heart Mother
|
||||
Pink Floyd - Meddle
|
||||
Pink Floyd - More
|
||||
Pink Floyd - Obscured by Clouds
|
||||
Pink Floyd - Relics
|
||||
Pink Floyd - The Dark Side of the Moon
|
||||
Pink Floyd - The Division Bell
|
||||
Pink Floyd - The Final Cut
|
||||
Pink Floyd - The Piper at the Gates of Dawn
|
||||
Pink Floyd - The Wall
|
||||
Pink Floyd - Ummagumma
|
||||
Pink Floyd - Wish You Were Here
|
||||
ProleteR - Bubbles
|
||||
ProleteR - Curses EP (Bonus Tracks)
|
||||
ProleteR - Curses from Past Times (2018 Digital Remaster, 15 Tracks)
|
||||
ProleteR - Curses From Past Times (Bandcamp)
|
||||
ProleteR - Fairuz
|
||||
ProleteR - Feeding the lions EP
|
||||
ProleteR - Rookie EP
|
||||
ProleteR - Tribute to the Masters Vol.1
|
||||
ProleteR - Tribute to the Masters Vol.2
|
||||
Queen - A Day at the Races
|
||||
Queen - A Kind of Magic
|
||||
Queen - A Night at the Opera
|
||||
Queen - Flash Gordon
|
||||
Queen - Hot Space
|
||||
Queen - Innuendo
|
||||
Queen - Jazz
|
||||
Queen - Made in Heaven
|
||||
Queen - News of the World
|
||||
Queen - Queen
|
||||
Queen - Queen II
|
||||
Queen - Sheer Heart Attack
|
||||
Queen - The Game
|
||||
Queen - The Miracle
|
||||
Queen - The Works
|
||||
Radiohead - A Moon Shaped Pool
|
||||
Radiohead - Amnesiac
|
||||
Radiohead - Hail to the Thief
|
||||
Radiohead - In Rainbows
|
||||
Radiohead - In Rainbows Disk 2
|
||||
Radiohead - Kid A
|
||||
Radiohead - OK Computer
|
||||
Radiohead - OK Computer OKNOTOK 1997 2017
|
||||
Radiohead - Pablo Honey
|
||||
Radiohead - The Bends
|
||||
Radiohead - The King of Limbs
|
||||
RAH Band - Going Up
|
||||
RAH Band - Mystery
|
||||
RAH Band - Past, Present & Future
|
||||
RAH Band - RAH
|
||||
RAH Band - The Crunch and Beyond
|
||||
Red Two Six - Red Two Six
|
||||
Red Vox - Afterthoughts
|
||||
Red Vox - Another Light
|
||||
Red Vox - Blood Bagel
|
||||
Red Vox - Kerosene
|
||||
Red Vox - Lost for a While
|
||||
Red Vox - Realign
|
||||
Red Vox - Trolls and Goblins
|
||||
Red Vox - Visions
|
||||
Red Vox - What Could Go Wrong
|
||||
Rob Cantor - Not a Trampoline
|
||||
Seatbelts - COWBOY BEBOP (Original Motion Picture Soundtrack)
|
||||
Slaughter Beach, Dog - At the Moonbase
|
||||
Slaughter Beach, Dog - Birdie
|
||||
Slaughter Beach, Dog - Motorcycle.jpg
|
||||
Slaughter Beach, Dog - Safe and Also No Fear
|
||||
Slaughter Beach, Dog - Welcome
|
||||
Summer Salt - Avenue G
|
||||
Summer Salt - Driving to Hawaii
|
||||
Summer Salt - Favorite Holiday, Vol 1
|
||||
Summer Salt - Going Native
|
||||
Summer Salt - Happy Camper
|
||||
Summer Salt - Honeyweed
|
||||
Summer Salt - Sequoia Moon
|
||||
Summer Salt - So Polite
|
||||
sungazer - sungazer, vol. I
|
||||
Surf Curse - Buds
|
||||
Surf Curse - Magic Hour
|
||||
Surf Curse - Nothing Yet
|
||||
Surf Curse - Sad Boys
|
||||
Talking Heads - Fear of Music
|
||||
Talking Heads - More Songs About Buildings and Food
|
||||
Talking Heads - Remain in Light
|
||||
Talking Heads - Speaking in Tongues
|
||||
Talking Heads - Talking Heads_ 77
|
||||
Talking Heads - True Stories
|
||||
Tally Hall - Admittedly Incomplete Demos
|
||||
Tally Hall - Complete Demos
|
||||
Tally Hall - Good & Evil
|
||||
Tally Hall - Marvin’s Marvelous Mechanical Museum
|
||||
Tame Impala - Currents
|
||||
Tame Impala - Innerspeaker
|
||||
Tame Impala - Lonerism
|
||||
Tame Impala - The Slow Rush
|
||||
The Basics - B.A.S.I.C_
|
||||
The Basics - Get Back
|
||||
The Basics - Keep Your Friends Close
|
||||
The Basics - Stand Out _ Fit In
|
||||
The Basics - The Age of Entitlement
|
||||
The Beach Boys - 15 Big Ones
|
||||
The Beach Boys - 20_20
|
||||
The Beach Boys - All Summer Long
|
||||
The Beach Boys - Beach Boys’ Party!
|
||||
The Beach Boys - Carl and the Passions_ “So Tough”
|
||||
The Beach Boys - Friends
|
||||
The Beach Boys - Holland
|
||||
The Beach Boys - Keepin’ the Summer Alive
|
||||
The Beach Boys - L.A. (Light Album)
|
||||
The Beach Boys - Little Deuce Coupe
|
||||
The Beach Boys - Love You
|
||||
The Beach Boys - M.I.U. Album
|
||||
The Beach Boys - Pet Sounds
|
||||
The Beach Boys - Shut Down, Volume 2
|
||||
The Beach Boys - Smiley Smile
|
||||
The Beach Boys - Summer Days (And Summer Nights!!)
|
||||
The Beach Boys - Sunflower
|
||||
The Beach Boys - Surf’s Up
|
||||
The Beach Boys - Surfer Girl
|
||||
The Beach Boys - Surfin’ Safari
|
||||
The Beach Boys - Surfin’ USA
|
||||
The Beach Boys - That's Why God Made the Radio
|
||||
The Beach Boys - The Beach Boys
|
||||
The Beach Boys - The Beach Boys Today!
|
||||
The Beach Boys - The Beach Boys’ Christmas Album
|
||||
The Beach Boys - Wild Honey
|
||||
The Beatles - A Hard Day’s Night
|
||||
The Beatles - Abbey Road (super deluxe edition)
|
||||
The Beatles - Beatles for Sale
|
||||
The Beatles - Help!
|
||||
The Beatles - Let It Be (super deluxe)
|
||||
The Beatles - Magical Mystery Tour
|
||||
The Beatles - Please Please Me
|
||||
The Beatles - Revolver (super deluxe)
|
||||
The Beatles - Rubber Soul
|
||||
The Beatles - Sgt. Pepper’s Lonely Hearts Club Band (super deluxe edition)
|
||||
The Beatles - The Beatles
|
||||
The Beatles - With The Beatles
|
||||
The Beatles - Yellow Submarine
|
||||
The Brobecks - Violent Things
|
||||
The Fat Wascally Wabbits - CHUNGUSCORE
|
||||
The Killers - Battle Born
|
||||
The Killers - Day & Age
|
||||
The Killers - Hot Fuss
|
||||
The Killers - Imploding the Mirage
|
||||
The Killers - Pressure Machine
|
||||
The Killers - Sam’s Town
|
||||
The Killers - Wonderful Wonderful
|
||||
The Mama’s and the Papa’s - If You Can Believe Your Eyes and Ears
|
||||
The Mamas & the Papas - Deliver
|
||||
The Mamas & the Papas - People Like Us
|
||||
The Mamas & the Papas - The Mamas & the Papas
|
||||
The Mamas & the Papas - The Papas & the Mamas
|
||||
The Smashing Pumpkins - ATUM_ A Rock Opera in Three Acts
|
||||
The Smashing Pumpkins - CYR
|
||||
The Smashing Pumpkins - Gish
|
||||
The Smashing Pumpkins - MACHINA_the machines of God
|
||||
The Smashing Pumpkins - Mellon Collie and the Infinite Sadness
|
||||
The Smashing Pumpkins - Pisces Iscariot
|
||||
The Smashing Pumpkins - SHINY AND OH SO BRIGHT, VOL. 1 _ LP_ NO PAST. NO FUTURE. NO SUN_
|
||||
The Velvet Underground - Loaded
|
||||
The Velvet Underground - Squeeze
|
||||
The Velvet Underground - The Velvet Underground
|
||||
The Velvet Underground - White Light_White Heat
|
||||
The Velvet Underground & Nico - The Velvet Underground & Nico
|
||||
The Weeknd - After Hours
|
||||
The Weeknd - Beauty Behind the Madness
|
||||
The Weeknd - Dawn FM
|
||||
The Weeknd - Kiss Land
|
||||
The Weeknd - Starboy
|
||||
The Young Veins - Take a Vacation!
|
||||
They Might Be Giants - Apollo 18
|
||||
They Might Be Giants - BOOK
|
||||
They Might Be Giants - Factory Showroom
|
||||
They Might Be Giants - Flood
|
||||
They Might Be Giants - Glean
|
||||
They Might Be Giants - I Like Fun
|
||||
They Might Be Giants - John Henry
|
||||
They Might Be Giants - Join Us
|
||||
They Might Be Giants - Lincoln
|
||||
They Might Be Giants - Long Tall Weekend
|
||||
They Might Be Giants - Mink Car
|
||||
They Might Be Giants - Nanobots
|
||||
They Might Be Giants - Phone Power
|
||||
They Might Be Giants - The Else
|
||||
They Might Be Giants - The Spine
|
||||
They Might Be Giants - They Might Be Giants
|
||||
Three Dog Night - American Pastime
|
||||
Three Dog Night - Coming Down Your Way
|
||||
Three Dog Night - Cyan
|
||||
Three Dog Night - Hard Labor
|
||||
Three Dog Night - Harmony
|
||||
Three Dog Night - It Ain't Easy
|
||||
Three Dog Night - Naturally
|
||||
Three Dog Night - Seven Separate Fools
|
||||
Three Dog Night - Suitable for Framing
|
||||
Three Dog Night - Three Dog Night
|
||||
Toby Fox - DELTARUNE Chapter 1 Soundtrack
|
||||
Toby Fox - DELTARUNE Chapter 2 Soundtrack
|
||||
Toby Fox - UNDERTALE Soundtrack
|
||||
Tokyo Elvis - Re-tail
|
||||
Triple‐Q - Crimes Against the Internet
|
||||
Triple‐Q - Death By Cancellation
|
||||
Triple‐Q - The Birthday Girl vs. the Internet
|
||||
Triple‐Q - with love, your problematic fave
|
||||
twenty one pilots - Blurryface
|
||||
twenty one pilots - Scaled and Icy
|
||||
twenty one pilots - Trench
|
||||
twenty one pilots - Twenty One Pilots
|
||||
twenty one pilots - Vessel
|
||||
Tyler, the Creator - CALL ME IF YOU GET LOST
|
||||
Tyler, the Creator - Cherry Bomb
|
||||
Tyler, the Creator - Flower Boy
|
||||
Tyler, the Creator - Goblin
|
||||
Tyler, the Creator - IGOR
|
||||
Tyler, the Creator - Wolf
|
||||
underscores - boneyard aka fearmonger
|
||||
underscores - fishmonger
|
||||
underscores - Skin Purifying Treatment
|
||||
Valve - Half‐Life (original Game Soundtrack)
|
||||
Valve - Half‐Life 2 (original Game Soundtrack)
|
||||
Valve - Half‐Life 2_ Episode One (original Game Soundtrack)
|
||||
Valve - Half‐Life 2_ Episode Two (original Game Soundtrack)
|
||||
Valve - Half‐Life_ Alyx
|
||||
Valve Studio Orchestra - Fight Songs_ The Music of Team Fortress 2
|
||||
Valve Studio Orchestra - The DOTA 2 Official Soundtrack
|
||||
Various Artists - Pokémon DP Sound Library
|
||||
Viktor Vaughn - Vaudeville Villain
|
||||
Vine - Ether Reality
|
||||
Vine - Odds and Ends
|
||||
Vine - Room to Breathe
|
||||
Vine - Sibilants
|
||||
Vinyl Theatre - Electrogram
|
||||
Vinyl Theatre - Origami
|
||||
Wavves - Afraid of Heights
|
||||
Wavves - Hideaway
|
||||
Wavves - King of the Beach
|
||||
Wavves - Life Sux
|
||||
Wavves - V
|
||||
Wavves - Wavves
|
||||
Wavves - Wavvves
|
||||
Wavves - You're Welcome
|
||||
Wavves × Cloud Nothings - No Life for Me
|
||||
Ween - 12 Golden Country Greats
|
||||
Ween - Chocolate & Cheese
|
||||
Ween - GodWeenSatan_ The Oneness
|
||||
Ween - Pure Guava
|
||||
Ween - Quebec
|
||||
Ween - The Mollusk
|
||||
Ween - The Pod
|
||||
Ween - White Pepper
|
||||
Weezer - Death to False Metal
|
||||
Weezer - Everything Will Be Alright in the End
|
||||
Weezer - Hurley
|
||||
Weezer - Make Believe
|
||||
Weezer - Maladroit
|
||||
Weezer - OK Human
|
||||
Weezer - Pacific Daydream
|
||||
Weezer - Pinkerton
|
||||
Weezer - Raditude
|
||||
Weezer - SZNZ_ Autumn
|
||||
Weezer - SZNZ_ Spring
|
||||
Weezer - SZNZ_ Summer
|
||||
Weezer - SZNZ_ Winter
|
||||
Weezer - Van Weezer
|
||||
Weezer - Weezer (Black Album)
|
||||
Weezer - Weezer (Blue Album)
|
||||
Weezer - Weezer (Green Album)
|
||||
Weezer - Weezer (Red Album)
|
||||
Weezer - Weezer (Teal Album)
|
||||
Weezer - Weezer (White Album, deluxe edition)
|
||||
YOASOBI - E-SIDE
|
||||
YOASOBI - E-SIDE 2
|
||||
YOASOBI - Into The Night
|
||||
YOASOBI - THE BOOK
|
||||
YOASOBI - THE BOOK 2
|
||||
YOASOBI - アイドル
|
||||
YOASOBI - はじめての - EP
|
||||
YOASOBI - 夜に駆ける
|
||||
増田順一 - Pokémon Game Sound Library
|
40
hq2cd-ps1/old/too_hq_old.ps1
Normal file
40
hq2cd-ps1/old/too_hq_old.ps1
Normal file
@ -0,0 +1,40 @@
|
||||
# Function to check if a file is not CD quality
|
||||
function IsNotCDQuality($filePath) {
|
||||
$ffprobeOutput = & ffprobe.exe -v error -select_streams a:0 -show_entries stream=sample_fmt,sample_rate -of csv=p=0 "$filePath"
|
||||
|
||||
if ($ffprobeOutput -eq $null) {
|
||||
# ffprobe didn't return any output, possibly due to unsupported file format
|
||||
return $true # Treat it as not CD quality
|
||||
}
|
||||
|
||||
$sampleFormat, $sampleRate = $ffprobeOutput.Split(',')
|
||||
|
||||
return ($sampleFormat -ne "s16" -or $sampleRate -ne "44100")
|
||||
}
|
||||
|
||||
# Recursive function to scan directories
|
||||
function ScanDirectories($path) {
|
||||
# Get all files in the current directory
|
||||
$files = Get-ChildItem -File -Path $path
|
||||
|
||||
# Check each file
|
||||
foreach ($file in $files) {
|
||||
if (IsNotCDQuality $file.FullName) {
|
||||
if ($path.Length -ge 12) {
|
||||
$forPrint = $path.Substring(12)
|
||||
$forPrint = $forPrint.Replace("\", " - ")
|
||||
Write-Output $forPrint
|
||||
}
|
||||
break # Only need to output the directory once
|
||||
}
|
||||
}
|
||||
|
||||
# Recursively scan subdirectories
|
||||
$subdirectories = Get-ChildItem -Directory -Path $path
|
||||
foreach ($subdirectory in $subdirectories) {
|
||||
ScanDirectories $subdirectory.FullName
|
||||
}
|
||||
}
|
||||
|
||||
# Start scanning from the current directory
|
||||
ScanDirectories (Get-Location).Path
|
8
hq2cd-py/.idea/.gitignore
generated
vendored
Normal file
8
hq2cd-py/.idea/.gitignore
generated
vendored
Normal file
@ -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
|
6
hq2cd-py/.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
hq2cd-py/.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
1
html-folder-dl/website-dl.ps1
Normal file
1
html-folder-dl/website-dl.ps1
Normal file
@ -0,0 +1 @@
|
||||
wget -r -nd -np $args[0]
|
4
mcrcon/rcon.ps1
Normal file
4
mcrcon/rcon.ps1
Normal file
@ -0,0 +1,4 @@
|
||||
$ip = "localhost"
|
||||
$ip = Read-Host -Prompt 'Enter the RCON IP (default: localhost)'
|
||||
$password = Read-Host -MaskInput -Prompt 'Enter the RCON Password'
|
||||
mcrcon -H $ip -p $password
|
29
obs-replay-notification/Beep_on_replay_buffer_save.lua
Normal file
29
obs-replay-notification/Beep_on_replay_buffer_save.lua
Normal file
@ -0,0 +1,29 @@
|
||||
local obs = obslua
|
||||
local ffi = require("ffi")
|
||||
local winmm = ffi.load("Winmm")
|
||||
|
||||
-- Put a sound of your choosing next to "Beep on replay save.lua" and don't forget to match its name either in code below or rename your file.
|
||||
PROP_AUDIO_FILEPATH = script_path() .. "sound_npc_scanner_scanner_photo1.wav"
|
||||
|
||||
ffi.cdef[[
|
||||
bool PlaySound(const char *pszSound, void *hmod, uint32_t fdwSound);
|
||||
]]
|
||||
|
||||
function playsound(filepath)
|
||||
winmm.PlaySound(filepath, nil, 0x00020000)
|
||||
end
|
||||
|
||||
function on_event(event)
|
||||
if event == obs.OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED
|
||||
then playsound(PROP_AUDIO_FILEPATH)
|
||||
end
|
||||
end
|
||||
|
||||
function script_load(settings)
|
||||
obs.obs_frontend_add_event_callback(on_event)
|
||||
end
|
||||
|
||||
-- This Lua script was downloaded from https://gist.github.com/snakecase/e816384a071cec31efbb4b9e429c108d
|
||||
|
||||
-- Credits: upgradeQ (https://gist.github.com/upgradeQ/b2412242d76790d7618d6b0996c4562f), gima (https://gitlab.com/gima/obsnotification)
|
||||
-- Thank you guys!
|
Binary file not shown.
BIN
obs-replay-notification/sound_npc_scanner_scanner_photo1.wav
Normal file
BIN
obs-replay-notification/sound_npc_scanner_scanner_photo1.wav
Normal file
Binary file not shown.
2
scrcpy-default/scrcpy-default.ps1
Normal file
2
scrcpy-default/scrcpy-default.ps1
Normal file
@ -0,0 +1,2 @@
|
||||
# Want higher bitrate, 20Mbps, and to use AAC audio codec at 320kbps, as well as up to 144 fps
|
||||
scrcpy --video-bit-rate=20M --audio-codec aac --audio-bit-rate=320K --max-fps 144 --turn-screen-off
|
5
vimm/.gitignore
vendored
Normal file
5
vimm/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
# Don't commit virtualenv
|
||||
venv
|
||||
|
||||
# Ignore pycache
|
||||
__pycache__
|
8
vimm/.idea/.gitignore
generated
vendored
Normal file
8
vimm/.idea/.gitignore
generated
vendored
Normal file
@ -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
|
6
vimm/.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
vimm/.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
11
vimm/.idea/misc.xml
generated
Normal file
11
vimm/.idea/misc.xml
generated
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.11" />
|
||||
</component>
|
||||
<component name="DiscordProjectSettings">
|
||||
<option name="show" value="ASK" />
|
||||
<option name="description" value="" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (vimm)" project-jdk-type="Python SDK" />
|
||||
</project>
|
8
vimm/.idea/modules.xml
generated
Normal file
8
vimm/.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/vimm.iml" filepath="$PROJECT_DIR$/.idea/vimm.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
17
vimm/.idea/runConfigurations/update_reqs.xml
generated
Normal file
17
vimm/.idea/runConfigurations/update_reqs.xml
generated
Normal file
@ -0,0 +1,17 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="update reqs" type="ShConfigurationType">
|
||||
<option name="SCRIPT_TEXT" value="pipreqs ." />
|
||||
<option name="INDEPENDENT_SCRIPT_PATH" value="false" />
|
||||
<option name="SCRIPT_PATH" value="$PROJECT_DIR$/wbfs-test.ps1" />
|
||||
<option name="SCRIPT_OPTIONS" value="" />
|
||||
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
||||
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
||||
<option name="INTERPRETER_PATH" value="" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
<option name="EXECUTE_IN_TERMINAL" value="true" />
|
||||
<option name="EXECUTE_SCRIPT_FILE" value="false" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
24
vimm/.idea/runConfigurations/vimm.xml
generated
Normal file
24
vimm/.idea/runConfigurations/vimm.xml
generated
Normal file
@ -0,0 +1,24 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="vimm" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
|
||||
<module name="vimm" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
<option name="PARENT_ENVS" value="true" />
|
||||
<envs>
|
||||
<env name="PYTHONUNBUFFERED" value="1" />
|
||||
</envs>
|
||||
<option name="SDK_HOME" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||
<option name="IS_MODULE_SDK" value="true" />
|
||||
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/vimm.py" />
|
||||
<option name="PARAMETERS" value="" />
|
||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||
<option name="EMULATE_TERMINAL" value="false" />
|
||||
<option name="MODULE_MODE" value="false" />
|
||||
<option name="REDIRECT_INPUT" value="false" />
|
||||
<option name="INPUT_FILE" value="" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
17
vimm/.idea/runConfigurations/wbfs_test.xml
generated
Normal file
17
vimm/.idea/runConfigurations/wbfs_test.xml
generated
Normal file
@ -0,0 +1,17 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="wbfs test" type="ShConfigurationType">
|
||||
<option name="SCRIPT_TEXT" value="" />
|
||||
<option name="INDEPENDENT_SCRIPT_PATH" value="false" />
|
||||
<option name="SCRIPT_PATH" value="$PROJECT_DIR$/wbfs-test.ps1" />
|
||||
<option name="SCRIPT_OPTIONS" value="" />
|
||||
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
||||
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
||||
<option name="INTERPRETER_PATH" value="" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
<option name="EXECUTE_IN_TERMINAL" value="true" />
|
||||
<option name="EXECUTE_SCRIPT_FILE" value="true" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
8
vimm/.idea/vimm.iml
generated
Normal file
8
vimm/.idea/vimm.iml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.9 (vimm)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
9
vimm/README.md
Normal file
9
vimm/README.md
Normal file
@ -0,0 +1,9 @@
|
||||
# Vimm's Lair Downloader
|
||||
|
||||
Functional but less than optimal Vimm's lair downloader
|
||||
|
||||
Only tested on Wii games, but it could be adapted for other stuff
|
||||
|
||||
Created because I wanted to download without clicking overnight (does not bypass more than 1 file limit)
|
||||
|
||||
But after doing some research and remembering I made my archive.org ROM downloader, which is very simple but more fully featured
|
5
vimm/bruno-vimm/bruno.json
Normal file
5
vimm/bruno-vimm/bruno.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"version": "1",
|
||||
"name": "vimm",
|
||||
"type": "collection"
|
||||
}
|
32
vimm/bruno-vimm/test1.bru
Normal file
32
vimm/bruno-vimm/test1.bru
Normal file
@ -0,0 +1,32 @@
|
||||
meta {
|
||||
name: test1
|
||||
type: http
|
||||
seq: 1
|
||||
}
|
||||
|
||||
get {
|
||||
url: https://download2.vimm.net/download/?mediaId=9709&alt=1
|
||||
body: none
|
||||
auth: none
|
||||
}
|
||||
|
||||
query {
|
||||
mediaId: 9709
|
||||
alt: 1
|
||||
}
|
||||
|
||||
headers {
|
||||
Referer: https://vimm.net/
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
|
||||
~Accept-Encoding: gzip, deflate, br
|
||||
~Connection: keep-alive
|
||||
~Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/jxl,image/webp,*/*;q=0.8
|
||||
~Accept-Language: en,en-CA;q=0.7,en-US;q=0.3
|
||||
~DNT: 1
|
||||
~Sec-GPC: 1
|
||||
~Upgrade-Insecure-Requests: 1
|
||||
~Sec-Fetch-Dest: document
|
||||
~Sec-Fetch-Mode: navigate
|
||||
~Sec-Fetch-Site: same-site
|
||||
~Sec-Fetch-User: ?1
|
||||
}
|
32
vimm/bruno-vimm/test2.bru
Normal file
32
vimm/bruno-vimm/test2.bru
Normal file
@ -0,0 +1,32 @@
|
||||
meta {
|
||||
name: test2
|
||||
type: http
|
||||
seq: 2
|
||||
}
|
||||
|
||||
get {
|
||||
url: https://download2.vimm.net/download/?mediaId=9704&alt=1
|
||||
body: none
|
||||
auth: none
|
||||
}
|
||||
|
||||
query {
|
||||
mediaId: 9704
|
||||
alt: 1
|
||||
}
|
||||
|
||||
headers {
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/jxl,image/webp,*/*;q=0.8
|
||||
Accept-Language: en,en-CA;q=0.7,en-US;q=0.3
|
||||
Accept-Encoding: gzip, deflate, br
|
||||
DNT: 1
|
||||
Sec-GPC: 1
|
||||
Connection: keep-alive
|
||||
Referer: https://vimm.net/
|
||||
Upgrade-Insecure-Requests: 1
|
||||
Sec-Fetch-Dest: document
|
||||
Sec-Fetch-Mode: navigate
|
||||
Sec-Fetch-Site: same-site
|
||||
Sec-Fetch-User: ?1
|
||||
}
|
2
vimm/requirements.txt
Normal file
2
vimm/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
beautifulsoup4==4.12.2
|
||||
Requests==2.31.0
|
18
vimm/vimm-bulk.py
Normal file
18
vimm/vimm-bulk.py
Normal file
@ -0,0 +1,18 @@
|
||||
import sys
|
||||
|
||||
from vimm import download
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage: python vimm-bulk.py <filename> <filetype>")
|
||||
exit(1)
|
||||
|
||||
with open(sys.argv[1], "r") as file:
|
||||
for line in file:
|
||||
line = line.strip()
|
||||
download(line, sys.argv[2])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
119
vimm/vimm.py
Normal file
119
vimm/vimm.py
Normal file
@ -0,0 +1,119 @@
|
||||
import json
|
||||
import sys
|
||||
import logging
|
||||
|
||||
import requests
|
||||
from enum import Enum
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
# User Agent
|
||||
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0"
|
||||
|
||||
# Referer
|
||||
referer = "https://vimm.net/"
|
||||
|
||||
# Download URL
|
||||
download_url2 = "https://download2.vimm.net/download/"
|
||||
|
||||
|
||||
# Enum for type of download,
|
||||
class WiiType(Enum):
|
||||
wbfs = 0
|
||||
rvz = 1
|
||||
|
||||
|
||||
def get_media_id(page_content):
|
||||
# Could be used later to be a method to extract the id from passed in json
|
||||
pass
|
||||
|
||||
|
||||
def download(url, filetype):
|
||||
page_request = requests.get(url, headers={"User-Agent": user_agent})
|
||||
page_content = BeautifulSoup(page_request.content, 'html.parser')
|
||||
|
||||
# Find div with the class "sectionTitle"
|
||||
section_titles = page_content.find_all("div", class_="sectionTitle")
|
||||
section_title = section_titles[0].text
|
||||
|
||||
# TODO: use match statement
|
||||
if section_title == "Wii":
|
||||
if filetype == "wbfs":
|
||||
download_wii(page_content, WiiType.wbfs)
|
||||
elif filetype == "rvz":
|
||||
download_wii(page_content, WiiType.rvz)
|
||||
|
||||
|
||||
def download_wii(page_content, filetype):
|
||||
# Wish there was a better way to do this, manually parsing javascript for a variable
|
||||
|
||||
# Find script that contains 'var media = '
|
||||
scripts = page_content.find_all("script")
|
||||
|
||||
script = str
|
||||
# Find script that contains 'var media = '
|
||||
for i in scripts:
|
||||
if "var media = " in i.text:
|
||||
script = i.string
|
||||
|
||||
media = list()
|
||||
# This is the default usage, pycharm bug
|
||||
# noinspection PyArgumentList
|
||||
for lines in script.splitlines():
|
||||
if "var media = " in lines:
|
||||
media.append(lines)
|
||||
|
||||
for i in range(0, len(media)):
|
||||
media[i] = media[i].replace(" var media = ", "")
|
||||
media[i] = media[i].replace(";", "")
|
||||
|
||||
# Parse lines as json
|
||||
media_json = list()
|
||||
for i in media:
|
||||
media_json.append(json.loads(i))
|
||||
|
||||
# Sort by version
|
||||
media_json.sort(key=lambda x: x["Version"])
|
||||
|
||||
# Get ID of last entry
|
||||
last_id = media_json[-1]["ID"]
|
||||
|
||||
logging.log(logging.INFO, "File ID of Download: " + str(last_id))
|
||||
|
||||
# Get the title of the last entry
|
||||
filename = media_json[-1]["GoodTitle"].replace(".iso", ".7z")
|
||||
|
||||
logging.log(logging.INFO, "File Name of Download: " + filename)
|
||||
|
||||
# TODO: Parse json for file size
|
||||
|
||||
chunk_size = 1024 * 1024 * 10 # 10 MB
|
||||
|
||||
# Build request
|
||||
request = requests.Session()
|
||||
request.headers.update({"User-Agent": user_agent, "Referer": referer})
|
||||
request.params.update({"mediaId": last_id})
|
||||
if filetype == WiiType.rvz:
|
||||
request.params.update({"alt": filetype.value})
|
||||
r = request.get(download_url2, stream=True)
|
||||
with open(filename, "wb") as file:
|
||||
for chunk in r.iter_content(chunk_size=chunk_size):
|
||||
if chunk:
|
||||
file.write(chunk)
|
||||
|
||||
|
||||
def main():
|
||||
# Comment out to disable logging
|
||||
logging.getLogger().setLevel(logging.INFO)
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage: python vimm.py <url> <filetype>")
|
||||
exit(1)
|
||||
|
||||
# Get arguments
|
||||
url = sys.argv[1]
|
||||
filetype = sys.argv[2]
|
||||
download(url, filetype)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
1
vimm/wbfs-test.ps1
Normal file
1
vimm/wbfs-test.ps1
Normal file
@ -0,0 +1 @@
|
||||
python vimm.py https://vimm.net/vault/18170 wbfs
|
35
vimm/wii-games.txt
Normal file
35
vimm/wii-games.txt
Normal file
@ -0,0 +1,35 @@
|
||||
https://vimm.net/vault/17392
|
||||
https://vimm.net/vault/17508
|
||||
https://vimm.net/vault/17667
|
||||
https://vimm.net/vault/17668
|
||||
https://vimm.net/vault/17669
|
||||
https://vimm.net/vault/17677
|
||||
https://vimm.net/vault/17683
|
||||
https://vimm.net/vault/17746
|
||||
https://vimm.net/vault/17874
|
||||
https://vimm.net/vault/17892
|
||||
https://vimm.net/vault/17893
|
||||
https://vimm.net/vault/17902
|
||||
https://vimm.net/vault/17873
|
||||
https://vimm.net/vault/17938
|
||||
https://vimm.net/vault/17951
|
||||
https://vimm.net/vault/17978
|
||||
https://vimm.net/vault/18170
|
||||
https://vimm.net/vault/18171
|
||||
https://vimm.net/vault/18172
|
||||
https://vimm.net/vault/18175
|
||||
https://vimm.net/vault/18177
|
||||
https://vimm.net/vault/18235
|
||||
https://vimm.net/vault/18234
|
||||
https://vimm.net/vault/18236
|
||||
https://vimm.net/vault/18275
|
||||
https://vimm.net/vault/18293
|
||||
https://vimm.net/vault/18294
|
||||
https://vimm.net/vault/18295
|
||||
https://vimm.net/vault/18296
|
||||
https://vimm.net/vault/18297
|
||||
https://vimm.net/vault/18298
|
||||
https://vimm.net/vault/18299
|
||||
https://vimm.net/vault/18292
|
||||
https://vimm.net/vault/18291
|
||||
https://vimm.net/vault/18334
|
Reference in New Issue
Block a user