Last active
November 24, 2020 17:02
-
-
Save Qman11010101/a5f7ff7c6f29c531fcdd53ec836604de to your computer and use it in GitHub Desktop.
音楽クイズ改善版2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import glob | |
import os | |
import random | |
import time | |
import subprocess | |
import difflib | |
import mutagen | |
import vlc | |
# コマンド定義 | |
CMDPREF = "_" | |
GIVEUP = CMDPREF + "giveup" | |
LENGTH = CMDPREF + "length" | |
LETTER = CMDPREF + "letter" | |
ERROR = CMDPREF + "error" | |
REPLAY = CMDPREF + "replay" | |
ANOTHER = CMDPREF + "another" | |
ARTIST = CMDPREF + "artist" | |
player = vlc.MediaPlayer() | |
print("曲名クイズ!") | |
print("- 曲名の一部を入力してね!部分一致で判定するよ!") | |
print("- 曲名の1/2以上があっていれば正解だよ!完全に合っていたらパーフェクトだよ!") | |
print("- 曲が流れる時間は3~7秒だよ!") | |
print("- 次の曲に進むときはEnterを押してね!") | |
print(f"- どうしてもわからなかったら「{GIVEUP}」と入力してね!") | |
print(f"- もう一度聴きたい時は「{REPLAY}」と入力してね!") | |
print(f"- 曲名の長さが知りたい場合は「{LENGTH}」と入力してね!") | |
print(f"- 曲名の最初の文字が知りたい場合は「{LETTER}」と入力してね!") | |
print(f"- 曲の別の部分を再生したいときは「{ANOTHER}」と入力してね!") | |
print(f"- エラーが起きて再生されなかったときは「{ERROR}」と入力してね!") | |
print(f"- アーティスト名を知りたい時は「{ARTIST}」と入力してね!") | |
input("Enterを押すとスタートするよ!") | |
music_count = 1 | |
musics = glob.glob("**", recursive=True) | |
while True: | |
# ファイル選択 | |
if musics == []: | |
break | |
else: | |
while True: | |
filename = random.choice(musics) | |
if filename.endswith(".py") or filename.endswith(".txt") or filename.startswith("AlbumArt_") or "Folder" in filename: | |
musics.pop(musics.index(filename)) | |
else: | |
musics.pop(musics.index(filename)) | |
break | |
# 曲名取得・再生位置設定 | |
ms_tags = mutagen.File(filename, easy=True) | |
music_name = ms_tags["title"][0] | |
music_name_lower = music_name.lower().replace(" ", "").replace(" ", "").replace("!", "!").replace("?", "?").replace("♥", "♡") | |
waiting_time = random.randint(3, 7) | |
position = min(0.9, random.random()) | |
# 再生 | |
player.set_mrl(filename) | |
player.play() | |
print(f"{music_count}曲目を再生中…") | |
vlc.libvlc_media_player_set_position(player, position) | |
time.sleep(waiting_time) | |
player.stop() | |
print("さあ、曲名を入力してね!") | |
while True: | |
answer = input(">> ") | |
answer_lower = answer.lower().replace(" ", "").replace(" ", "").replace("!", "!").replace("?", "?").replace("♥", "♡") | |
if not answer.startswith(CMDPREF): | |
len_answer = len(answer) | |
min_letter = min(len(music_name)//2, len(music_name_lower)) | |
if len_answer >= min_letter: | |
df = difflib.SequenceMatcher(None, answer_lower, music_name_lower).ratio() | |
if answer == music_name: | |
print("パーフェクト!すごいね!") | |
break | |
elif answer_lower in music_name_lower: | |
print(f"正解!おめでとう! (合致率: {round(df*100, 2)}%)") | |
break | |
else: | |
print(f"残念!不正解! (合致率: {round(df*100, 2)}%)") | |
else: | |
print(f"入力文字数が少なすぎるよ!(あと{min_letter - len_answer}文字)") | |
else: | |
if answer == GIVEUP: | |
print("ナイストライ!") | |
break | |
elif answer == ERROR: | |
print("ごめんね!この曲は一旦スキップするよ") | |
print("Enterを押して次に進んでね!") | |
musics.append(filename) # 再生されなかった曲をリストに戻す | |
break | |
elif answer == REPLAY: | |
print("もう一度再生するよ!") | |
player.play() | |
print(f"{music_count}曲目を再生中…") | |
vlc.libvlc_media_player_set_position(player, position) | |
time.sleep(waiting_time) | |
player.stop() | |
elif answer == LENGTH: | |
print( | |
f"曲名は{len(music_name)}文字(スペースを無くすと{len(music_name_lower)}文字)だよ!") | |
elif answer == LETTER: | |
print(f"最初の文字は「{music_name[0]}」だよ!") | |
elif answer == ANOTHER: | |
waiting_time = random.randint(3, 7) | |
position = min(0.9, random.random()) | |
print("再生場所を変更して再生するよ!") | |
player.play() | |
print(f"{music_count}曲目を再生中…") | |
vlc.libvlc_media_player_set_position(player, position) | |
time.sleep(waiting_time) | |
player.stop() | |
elif answer == ARTIST: | |
try: | |
artist_name = f"アーティスト名は『{ms_tags['artist'][0]}』だよ!" | |
except: | |
artist_name = "エラー: アーティスト名を取得できなかったよ…" | |
print(artist_name) | |
else: | |
print("そんなコマンドはないよ!") | |
if answer != ERROR: | |
print(f"正解は「{music_name}」でした!") | |
music_count += 1 | |
input() | |
print("全曲が終了したよ!おつかれさま!") | |
input("Enterキーを押して終了してね!") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment