Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
wesleey committed Jun 29, 2024
0 parents commit 2167b5d
Show file tree
Hide file tree
Showing 83 changed files with 328 additions and 0 deletions.
9 changes: 9 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
2 changes: 2 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
CLIENT_ID="YOUR_CLIENT_ID"
CLIENT_SECRET="YOUR_CLIENT_SECRET"
39 changes: 39 additions & 0 deletions .github/workflows/optimize-and-deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Optimize and Deploy

on:
push:
branches:
- main

jobs:
optimize:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y webp librsvg2-bin
- name: Optimization
run: |
chmod +x optimize.sh
./optimize.sh -i src/albums -h 600 -q 100 -o out
./optimize.sh -i src/artists -h 300 -q 100 -o out
- name: Deploy
run: |
sudo chown -R $(whoami):$(whoami) .
git config --global user.email "[email protected]"
git config --global user.name "$GITHUB_ACTOR"
cp -r out/* /tmp
cd /tmp
git init
git branch -M gh-pages
git add .
git commit -m "Optimize images"
git remote add origin "https://$GITHUB_ACTOR:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY"
git push -f origin gh-pages
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.env
venv
138 changes: 138 additions & 0 deletions download.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
import os
import re
import requests
from unidecode import unidecode

from dotenv import load_dotenv
load_dotenv()

client_id = os.getenv('CLIENT_ID')
client_secret = os.getenv('CLIENT_SECRET')

auth_response = requests.post('https://accounts.spotify.com/api/token', {
'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret,
})

auth_response_data = auth_response.json()

try:
access_token = auth_response_data['access_token']
except KeyError:
print('Authentication failed.')
exit(1)

headers = {
'Authorization': f'Bearer {access_token}',
}


def main():
while True:
print('1 - Track')
print('2 - Artist')
print('3 - Exit')

try:
option = int(input('Option: '))
except ValueError:
print('Invalid option')
continue

match option:
case 1:
download_album_image(input('Track: '), 'albums')
case 2:
download_artist_image(input('Artist: '), 'artists')
case 3:
exit(0)
case _:
print('Invalid option')


def download_album_image(track_name, output_dir):
search_response = requests.get(
'https://api.spotify.com/v1/search',
headers=headers,
params={
'q': track_name,
'type': 'track',
'limit': 1
}
)

search_data = search_response.json()

try:
album = search_data['tracks']['items'][0]['album']
image_url = album['images'][0]['url']
album_name = album['name']
except (KeyError, IndexError):
print(f'No album image found for track: {track_name}')
return

filename = jpeg_filename(album_name)
save_path = os.path.join(output_dir, filename)

if not os.path.exists(save_path):
response = requests.get(image_url)
if response.status_code == 200:
os.makedirs(output_dir, exist_ok=True)
with open(save_path, 'wb') as file:
file.write(response.content)
print(f'{filename} download completed.')
else:
print(f'Failed to download image for track: {track_name}')
else:
print(f'{filename} already exists.')


def download_artist_image(artist_name, output_dir):
filename = jpeg_filename(artist_name)
save_path = os.path.join(output_dir, filename)

if not os.path.exists(save_path):
search_response = requests.get(
'https://api.spotify.com/v1/search',
headers=headers,
params={
'q': artist_name,
'type': 'artist',
'limit': 1
}
)

search_data = search_response.json()

try:
image_url = search_data['artists']['items'][0]['images'][0]['url']
artist_name = search_data['artists']['items'][0]['name']
except (KeyError, IndexError):
print(f'No image found for artist: {artist_name}')
return

response = requests.get(image_url)
if response.status_code == 200:
os.makedirs(output_dir, exist_ok=True)
with open(save_path, 'wb') as file:
file.write(response.content)
print(f'{filename} download completed.')
else:
print(f'Failed to download image for artist: {artist_name}')
else:
print(f'{filename} already exists.')


def jpeg_filename(name):
return f'{snake_case(name)}.jpeg'


def snake_case(text):
text = unidecode(text.strip().lower())
text = re.sub(r'\s+', '_', text)
return re.sub(r'[^\w_]', '', text)


if __name__ == '__main__':
main()
135 changes: 135 additions & 0 deletions optimize.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
#!/bin/bash

TEMP_DIR=temp
INPUT_DIR=src
OUTPUT_DIR=out

WIDTH=0
HEIGHT=300
IMAGE_QUALITY=100

while getopts "i:o:w:h:q:" opt; do
case ${opt} in
i )
INPUT_DIR=$OPTARG
;;
o )
OUTPUT_DIR=$OPTARG
;;
w )
WIDTH=$OPTARG
;;
h )
HEIGHT=$OPTARG
;;
q )
IMAGE_QUALITY=$OPTARG
;;
\? )
echo "Usage: ./optimize.sh [-i input_dir] [-o output_dir] [-w width] [-h height] [-q image_quality]"
exit 1
;;
esac
done

rm -rf "$TEMP_DIR"
mkdir -p "$OUTPUT_DIR"

mkdir "$TEMP_DIR"
cp -r "$INPUT_DIR"/* "$TEMP_DIR"

optimize_image() {
local input_file="$1"
local output_file="$2"
cwebp -q "$IMAGE_QUALITY" -m 6 -sharpness 0 -noalpha -resize "$WIDTH" "$HEIGHT" -quiet "$input_file" -o "$output_file"
}

convert_svg_to_webp() {
local input_file="$1"
local output_file="$2"
local temp_png="${output_file}.png"
rsvg-convert -o "$temp_png" "$input_file"
optimize_image "$temp_png" "$output_file"
rm "$temp_png"
}

optimize_webp() {
local input_file="$1"
local output_file="$2"
local temp_output="${output_file}.temp"

if webpmux -info "$input_file" 2>&1 | grep -q "No. of frames: 1"; then
optimize_image "$input_file" "$temp_output"
else
gif2webp -q "$IMAGE_QUALITY" "$input_file" -o "$temp_output"
fi

local original_size=$(stat -c %s "$input_file")
local new_size=$(stat -c %s "$temp_output")

if (( new_size < original_size )); then
mv "$temp_output" "$output_file"
echo "Optimized: $input_file -> $output_file (reduced size from $original_size to $new_size)"
else
rm "$temp_output"
cp "$input_file" "$output_file"
echo "Copied without change: $input_file -> $output_file"
fi
}

file_exists_in_output() {
local input_file="$1"
local filename=$(basename "$input_file")
[ -f "$OUTPUT_DIR/$filename" ]
}

process_images() {
for img in "$TEMP_DIR"/*.{jpg,jpeg,png}; do
[ -f "$img" ] || continue
filename=$(basename "$img" .${img##*.})
output_file="$OUTPUT_DIR/$filename.webp"
if ! file_exists_in_output "$output_file"; then
optimize_image "$img" "$output_file"
echo "Converted: $img -> $output_file"
fi
done
}

process_svgs() {
for svg in "$TEMP_DIR"/*.svg; do
[ -f "$svg" ] || continue
filename=$(basename "$svg" .svg)
output_file="$OUTPUT_DIR/$filename.webp"
if ! file_exists_in_output "$output_file"; then
convert_svg_to_webp "$svg" "$output_file"
echo "Converted: $svg -> $output_file"
fi
done
}

process_webps() {
for webp in "$TEMP_DIR"/*.webp; do
[ -f "$webp" ] || continue
filename=$(basename "$webp" .webp)
output_file="$OUTPUT_DIR/$filename.webp"
if ! file_exists_in_output "$output_file"; then
optimize_webp "$webp" "$output_file"
fi
done
}

process_images
process_svgs
process_webps

find "$TEMP_DIR" -type f ! -name '*.jpg' ! -name '*.jpeg' ! -name '*.png' ! -name '*.svg' -exec cp -v {} "$OUTPUT_DIR/" \;

files_count=$(find "$INPUT_DIR" -type f | wc -l)
echo "$files_count files in $INPUT_DIR"

total=$(find "$OUTPUT_DIR" -type f | wc -l)
echo "Total: $total files in $OUTPUT_DIR"

rm -rf "$TEMP_DIR"

echo "Optimization completed."
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
requests==2.32.3
unidecode==1.3.8
python-dotenv==1.0.1
Binary file added src/albums/21.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/24k_magic.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/25.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/after_hours.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/alone.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/am.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/an_evening_with_silk_sonic.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/beauty_behind_the_madness.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/billionaire_feat_bruno_mars.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/changes.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/dawn_fm.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/deluxe.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/die_for_you_remix.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/doowops__hooligans.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/easy_on_me.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/fck_love_3_over_you.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/finesse.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/hear_me_now_feat_zeeba.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/heroes__villains.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/heroes_tonight.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/hopes_and_fears_deluxe_edition.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/albums/i_love_you.jpeg
Binary file added src/albums/it_will_rain.jpeg
Binary file added src/albums/justice.jpeg
Binary file added src/albums/konvicted.jpeg
Binary file added src/albums/making_mirrors.jpeg
Binary file added src/albums/moves_like_jagger.jpeg
Binary file added src/albums/my_dear_melancholy.jpeg
Binary file added src/albums/my_world_20.jpeg
Binary file added src/albums/never_let_me_go.jpeg
Binary file added src/albums/on__on.jpeg
Binary file added src/albums/pablo_honey.jpeg
Binary file added src/albums/purpose_deluxe.jpeg
Binary file added src/albums/save_your_tears_remix.jpeg
Binary file added src/albums/shes_so_unusual.jpeg
Binary file added src/albums/shine.jpeg
Binary file added src/albums/skyfall.jpeg
Binary file added src/albums/starboy.jpeg
Binary file added src/albums/symbolism.jpeg
Binary file added src/albums/trouble.jpeg
Binary file added src/albums/true_colors.jpeg
Binary file added src/albums/unorthodox_jukebox.jpeg
Binary file added src/albums/uptown_special.jpeg
Binary file added src/albums/v.jpeg
Binary file added src/albums/versace_on_the_floor.jpeg
Binary file added src/albums/whenever_you_need_somebody.jpeg
Binary file added src/albums/x_deluxe_edition.jpeg
Binary file added src/albums/xscape.jpeg
Binary file added src/artists/adele.jpeg
Binary file added src/artists/akon.jpeg
Binary file added src/artists/alok.jpeg
Binary file added src/artists/arctic_monkeys.jpeg
Binary file added src/artists/bruno_mars.jpeg
Binary file added src/artists/cyndi_lauper.jpeg
Binary file added src/artists/ed_sheeran.jpeg
Binary file added src/artists/george_michael.jpeg
Binary file added src/artists/gotye.jpeg
Binary file added src/artists/justin_bieber.jpeg
Binary file added src/artists/justin_timberlake.jpeg
Binary file added src/artists/keane.jpeg
Binary file added src/artists/lewis_capaldi.jpeg
Binary file added src/artists/maroon_5.jpeg
Binary file added src/artists/marshmello.jpeg
Binary file added src/artists/no_copyright_music_sounds.jpeg
Binary file added src/artists/nocopyrightsounds.jpeg
Binary file added src/artists/radiohead.jpeg
Binary file added src/artists/rick_astley.jpeg
Binary file added src/artists/the_neighbourhood.jpeg
Binary file added src/artists/the_weeknd.jpeg

0 comments on commit 2167b5d

Please sign in to comment.