파이썬 모스크의 첫 뮤직비디오 연속 재생 - 노래 목록 스크롤 -

17177 단어 BlueStacksPython

개시하다


파이썬의 장르를 독학하기 위해 저는 스크스터의 뮤직비디오 연속 재생 기능을 선택했습니다. 그러나 완성된 프로그램은 뮤직비디오의 순환 재생만 있지만 실제로는 한 곡만 재생할 수 없습니다. 연속 재생 기능이라기보다는 너무 거칠습니다.
이번에는 재생이 끝난 후 곡 리스트를 아래로 보내는 동작을 시도해 봤다.
마지막 기사: 첫 파이썬 스타의 뮤직비디오를 연속으로 들려드리도록 하겠습니다.

설계



위와 같은 이미지의 레드박스 안쪽을 클릭하면 곡을 보낼 수 있지만, 곡 일람을 보면 곡마다 공통점이 완전히 다르고, 공통분으로 사용할 수 있는 범위도 다른 곡과 겹치기 때문에 유일한 부분을 선택하기가 어려울 것 같다.
여기서 화면에서 고유한 부분의 좌표를 가져온 다음 Offset 부분을 더한 좌표를 클릭합니다.
위 그림의 파란색 상자로 둘러싸인 부분을 대상으로 합니다.

소스 코드


pydef.py
# coding:utf-8
MAIN_PATH:str=".\\MVPlay\\"
FILE_TYPE:str="*.png"

#引数用定数
FILES:int=0
FILEEVENTS:int=1
WAITTIME:int=2

#X,Y座標取得用定数
X:int=0
Y:int=1

#イベント定義用定数
CLICK:int=0
SWIPE:int=1
RECURE:int=2
EXIT:int=3

#ファイルイベント用定数
FILE:int=0
EVENT:int=1
ARG1:int=2
ARG2:int=3
ARG3:int=4

#ファイルイベントを定義
FILEEVENTS_MAIN:list=[
    #ファイル名とマッチした画像の時、座標が指定された値分Offsetされた位置をクリックする
    [".\\MVPlay\\03scroll.png",CLICK,[220,630],None,None]
]
pyfunc.py
# coding:utf-8
from pydef import*

#ファイルイベントを取得
def getFileEvent(fn:str,fev):
    for tmpl in fev:
        if tmpl[FILE]==fn:
            return tmpl
    return None

#画像認識が成功する度増え続け、全てのファイルが終わったら最初に戻る
def sequentialCount(i:int,maxcount:int):
    if i>=maxcount:
        return 0
    else:
        return i+1
main.py
# coding:utf-8
import pyautogui
import glob
import time
from pydef import*
from pyfunc import*

#イベントに対応した処理を実行
#main関数を再帰的に呼び出すのでpyfuncではなくmainに記述
def fileEvent(arg:list,loc:list):
    #何もないときはクリック
    if arg==None:
        pyautogui.click(loc[X],loc[Y])
    #クリックイベント
    elif arg[EVENT]==CLICK:
        loc=[x+y for (x,y) in zip(loc,arg[ARG1])]
        pyautogui.click(loc[X],loc[Y])
    #スワイプイベント
    elif arg[EVENT]==SWIPE:
        _n=None #未実装
    #再帰処理イベント
    elif arg[EVENT]==RECURE:
        flist=glob.glob(arg[ARG1]+FILE_TYPE)
        main([flist,arg[ARG2],arg[ARG3]])
    #終了イベント
    elif arg[EVENT]==EXIT:
        exit()

#受け取ったファイルリストとファイルイベントリストを元に
#イベントを実行し続ける
def main(arg:list):
    i:int=0
    while True:
        #画像認識チェック
        loc=pyautogui.locateCenterOnScreen(arg[FILES][i])
        if not(loc==None):
            time.sleep(arg[WAITTIME])
            #ファイルイベント実行
            fileEvent(getFileEvent(arg[FILES][i],arg[FILEEVENTS]),loc)
            i=sequentialCount(i,len(arg[FILES])-1)
        time.sleep(arg[WAITTIME])

flist=glob.glob(MAIN_PATH+FILE_TYPE)
main([flist,FILEEVENTS_MAIN,0.5])
지난번과 비교하면 한꺼번에 길어졌지만 거의 상수적인 선언이었다.

간단한 설명


pydef.py
    [".\\MVPlay\\03scroll.png",CLICK,[220,630],None,None]
이 정의는'.\MVPlay\03 scroll.png'과 같은 이름의 파일을 읽을 때 이미지 인식에 일치하는 X 좌표와 Y 좌표에 각각 220620을 추가하고 클릭한다는 뜻이다.
main.py
#イベントに対応した処理を実行
#main関数を再帰的に呼び出すのでpyfuncではなくmainに記述
def fileEvent(arg:list,loc:list):
    #何もないときはクリック
    if arg==None:
        pyautogui.click(loc[X],loc[Y])
    #クリックイベント
    elif arg[EVENT]==CLICK:
        loc=[x+y for (x,y) in zip(loc,arg[ARG1])]
        pyautogui.click(loc[X],loc[Y])
    #スワイプイベント
    elif arg[EVENT]==SWIPE:
        _n=None #未実装
    #再帰処理イベント
    elif arg[EVENT]==RECURE:
        flist=glob.glob(arg[ARG1]+FILE_TYPE)
        main([flist,arg[ARG2],arg[ARG3]])
    #終了イベント
    elif arg[EVENT]==EXIT:
        exit()
파일에 정의된 이벤트는 새로 추가된 fileEvent 함수를 통해 처리됩니다.
CLICK 이외의 활동이 필요할 수 있기 때문에 지금은 특별한 의미가 없다.

총평가


이렇게 되면 뮤직비디오 버튼→재생 버튼→뮤직비디오를 틀고 곡 리스트 화면으로 돌아간 뒤 다음 곡으로 이동하는 일련의 작업이 자동화된다.
이번에 팀에서 생각한 것은list가 너무 편리하다는 것이다. 듣기도 잘 모르겠지만 만져보면 실감이 나고 파일 활동이 정의된 곳에서 호출 함수를 호출하는 디자인도 재미있다.

최후


곡 리스트의 모빌리티 기능으로 인해 자신의 이상에 가까운 연속 재생에 가까워진 느낌은 들었지만, 아직 미완성 곡과 뮤직비디오가 실장되지 않은 곡에서 재생을 중단하는 문제가 남아있다.
이어서 이 문제를 해결하고 싶다.

좋은 웹페이지 즐겨찾기