🌶️

[WIP]Spotify × Pythonで今の気分、作業内容、トレンドによってアルバムを自動作成する。

2022/03/14に公開約3,800字

webインターフェイスからの入力によるSpotifyのアルバム作成を行う。
イメージとしては下のような画面から、入力を行い。その入力内容によって独自にspotify APIを用いることでアルバムを作成する。
アルバム作成に用いる情報として、webインターフェイスから得られるその時の気分、今から行う作業内容に加えて、Spotify内の曲のランキング、温度などを用いた独自のアルゴリズムで選曲、アルバム作成を行う。とりあえず、ひとつのアルバムにつき10曲くらいを目安に追加する。

ここで用いるアルゴリズムには、spotify内の曲にそれぞれ付けられている以下のような情報をもとに作成していこうと思う。

環境構築

app--
--Dockerfile
--docker-compose.yaml
--README.md
--app
|--index.py
|--templates
--|--index.html
--|--create_album.html
|--spotify
--|--sp_controller.py

Dockerfile

FROM python:3.9

WORKDIR /app

COPY ./app /app

RUN pip install Flask
RUN pip install -U MarkupSafe
RUN pip install flask-login
RUN pip install flask-mysql
RUN pip install -U PyMySQL
RUN pip install python-dotenv

CMD ["python", "index.py"]

docker-compose.yaml

version: '3'
services:
  db:
    image: mysql:8.0
    platform: linux/x86_64
    container_name: demoapp-mysql-db
    hostname: demoapp-mysql-db
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    networks:
      - app-net
  flask:
    build: .
    ports:
      - "5005:80"
    volumes:
      - ./app:/app
    networks:
      - app-net
    depends_on:
      - db
networks:
  app-net:
    driver: bridge

volumes:
  db_data:

templates/index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <h2>今日の気分を入力しよう</h1>
    <form action="/create_album" method="POST">
        <input type="checkbox" name="date-term" value="morning">
        <label for="date-term">朝</label>
        <input type="checkbox" name="date-term" value="noon">
        <label for="date-term">昼</label>
        <input type="checkbox" name="date-term" value="night">
        <label for="date-term">夜</label><br>
        <select name="feeling">
            <option value="">--今の気分を選択しよう--</option>
            <option value="workingonsunshine">最高</option>
            <option value="feelinggood">気分がいい</option>
            <option value="soso">まあまあ</option>
            <option value="feelingbad">気分が悪い</option>
            <option value="depressed">落ち込んでる</option>
            <option value="wannadonothing">何もしたくない</option>
        </select><br>
        <select name="todo">
            <option value="">--今からする作業を選ぼう--</option>
            <option value="workingonsunshine">移動</option>
            <option value="feelinggood">コーディング</option>
            <option value="soso">事務作業</option>
            <option value="feelingbad">大学の勉強</option>
            <option value="depressed">記事</option>
            <option value="wannadonothing">睡眠</option>
        </select><br>
        <input type="submit" value="アルバム作成">
    </form>
</body>
</html>

index.py

from flask import Flask, render_template, request, session, url_for, redirect
from markupsafe import escape
import model
from spotify import sp_controller
app = Flask(__name__)


@app.route("/")
def index():
        return render_template('index.html')

@app.route("/create_album", methods=["POST", "GET"])
def create_album():
    album = sp_controller.manage_album(request.form["date-term"], request.form["feeling"], request.form["todo"])
    return render_template("spotify_page.html", album=album)

if __name__ == "__main__":
	app.run(host="0.0.0.0", port=80, debug=True)

続く。。。

Discussion

ログインするとコメントできます