Skip to content

Instantly share code, notes, and snippets.

@Qman11010101
Last active November 24, 2020 17:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Qman11010101/a5f7ff7c6f29c531fcdd53ec836604de to your computer and use it in GitHub Desktop.
Save Qman11010101/a5f7ff7c6f29c531fcdd53ec836604de to your computer and use it in GitHub Desktop.
音楽クイズ改善版2
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