음원추출 자동화 - [2]파일 옮기기

박병관·2022년 3월 3일
0
post-thumbnail

이유/계획🤷

이전의 글인 음원추출 자동화 - (220302)을 보면 알 수 있듯이 어제 음원 추출 후 다운로드 받는 과정까지 완성되었다

이제 다운로드 받은 파일의 이름 변경과 파일을 옮기는 과정이 필요하다

파일의 이름 변경은 이 글에서 볼 수 있는데, os 모듈의 os.rename(예전파일,새로운 파일이름) 을 사용하면 쉽게 해결할 수 있을 것 같다
음원 제목 변경은 필수가 아닐 수 있기 때문에 변경할 제목이 입력되면 변경, 비워두면 그대로 해서 진행되는 로직을 구현할 것이다

파일을 옮기는 과정을 간단하게 적어놓은 글을 봤는데, 그냥 shutil 이라는 모듈을 사용해 옮기는 파일의 위치와 옮길 위치를 지정해주면 파일이 이동되는 것 같다

지금 고민은, 이 파일 이동이 다른 외부의 저장소 까지 가능할지, MP3로 이동해야 하는데 이 MP3를 어떻게 선택하게 하는게 좋을까 에 신경써서 진행할거다

아무튼 그래서 오늘은 MP3를 가져왔다, 화이팅해보자

과정💦

이름 변경

그냥 단순하게 전 코드에서 ID를 선택헤서 text를 추출하려 했는데, 정말 방심했다

driver.close()

wait.until(EC.title_is((By.ID,'result_title')))
fileName = driver.find_element_by_id("result_title").text
print(fileName)

전의 광고텝을 close한 것 때문에 오류가 계속 났었는데

알고보니 위 driver.close() 때문에 보기에는 탭이 켜져 있지만 인식하지 못했었다
그래서 close 다음 탭까지 변경시켜주는 코드를 넣었다

import os
.
.
.
driver.switch_to.window(driver.window_handles[1])
driver.close()
driver.switch_to.window(driver.window_handles[0])

fileName = driver.find_element_by_id("result_title").text
print(fileName)

그렇게 id가 result_title 인 요소의 text를 저장하고 테스트 출력까지 완성되었다
이제 이 테스트출력에 사용한 fileName 을 활용해 download 폴더에서 음원 파일을 찾을 수 있었다

이 파일을 찾기 전 아래 코드처럼 파일명을 바꾼다면 파일명을 받고, 파일명을 바꾸지 않는다면 그냥 넘기면(enter) 각각에 맞게 처리가 되도록 하였다

import os
.
.
.
youtubeURL = input("유튜브 url입력 : ")
newFileName = input("(파일명을 바꾼다면)파일명 입력 : ")
.
.
.
time.sleep(30) # 임시로 sleep
# 오류가 뜰 수도 있기 때문에 문제가 된다면 wait으로 처리 할 예정

downloadLocation = "C:\\Users\\DGSW\\Downloads\\"

if newFileName: # 파일명에 변경이 있을 때
	os.rename(downloadLocation+fileName+".mp3",downloadLocation+newFileName+".mp3")
    fileName = newFileName # 변경하면 변경된 파일 이름이 파일 이름이 된다

코드를 보면 알수 있듯 큰 어려움은 딱히 없었다, 그냥 os.rename(예전 파일 이름, 새로운 파일 이름) 함수를 활용했다


추가로 이 코드를 보면서 나는 두 가지 부분이 걱정되었다
첫 번째는 time.sleep(30) 부분, 두 번째는 다운로드 위치가 사람마다 다르다는 부분이다

우선 다운로드 위치가 다른 것은 어떻게 해결할지 아직 좋은 아이디어가 생각나지 않았다

time.sleep(30) 부분에 대해 설명하자면, 다운로드를 받고 아래의 파일명 변경부분 로직을 실행해야 하기 때문에 다운로드를 받는 동안 시간을 기다리기 위한 함수이다

나도 이런 동적이지 않은 코드를 만들고 싶지는 않았지만 아래의 시행착오들을 보면 알 수 있듯 이 부분도 미래의 나에게 맡기기로 했다, 일단 지금은 큰 로직부터 완성시키자

# 첫 번째 시도
# 사실 만들다보니 그렇게 빠를 것 같다는 생각이 들지 않아서 사용해보지도 않았다, 
# 나중에 한 번에 수정할 때 시도해본다
# 오류가 없어도 이는 다운로드 파일을 모두 검색하기 때문에 느릴 수 있다고 생각
def findFile(fileName,downloadLocation):
    for dirpath, dirname, filename in os.walk(downloadLocation):
        if fileName in filename:
            return 1
    return 0
# 두 번째 시도
# 파일 찾는 함수
def findFile1(fileName,downloadLocation):
    # 다운로드폴더의 파일 목록들을 모두 가져온다
    fileList = os.listdir(downloadLocation)
    # 최근 다운로드 된 파일 3개까지 검색
    for i in range(-1,-3,-1):
        if fileList[i] == fileName:
            return 1
    return 0
    
# # 저장 되었을 때(파일명을 찾았을 때) 실행
wait.until(findFile1(fileName,downloadLocation))
# 3번째 시도 
# 최근 3개의 다운로드 파일을 검색,
# 찾을 때까지 while문을 돌린다
i = -1
fileList = os.listdir(downloadLocation)
while 1:
    if fileList[i] == fileName:
        break
    i -= 1
    if i == -4:
        i = -1

파일 위치 변경

파일 위치 변경은 정말 별게 없다, 사실 파이썬이 너무 편하다ㅎㅎ
아래의 코드처럼 shutil.move(옮길 파일 위치, 옮겨질 파일 위치) 함수를 사용해 변경했다

import shutil
.
.
.
# 파일 이동시키기
# mp3위치
changeLocation = "E:\\all\\"
shutil.move(downloadLocation+fileName+".mp3",changeLocation+fileName+".mp3")

위 코드를 보면 알수있듯 downloadLocation,fileName 등과 같은 변수들이 재사용이 되는데, 이렇게 변수들이 딱딱 쓰임에 따라 재사용 되는게 기분좋았다

결과🏅

저번 글에서 이유를 말했듯 아래는 전체 코드이다

from xmlrpc.client import Boolean
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os # 파일명 변경
import shutil # 파일 이동

# youtubeURL = input()
youtubeURL = input("유튜브 url입력 : ")
newFileName = input("(파일명을 바꾼다면)파일명 입력 : ")


driver = webdriver.Chrome()
driver.get('https://onlinevideoconverter.pro/ko/youtube-converter-mp3#')
driver.find_element_by_id("texturl").send_keys(youtubeURL)
driver.find_element_by_id("convert1").click()

# Explicity wait = 명시적으로 어던 조건이 성립될 때까지 기다림
wait = WebDriverWait(driver, 30)
wait.until(EC.element_to_be_clickable((By.ID,'download-720-MP4')))

driver.find_element_by_id("download-720-MP4").click()

driver.switch_to.window(driver.window_handles[1])
driver.close()
driver.switch_to.window(driver.window_handles[0])

fileName = driver.find_element_by_id("result_title").text
print(fileName)

# ▲(220302)----------------- ▼(220303)

time.sleep(30) # 임시로 sleep
# 오류가 뜰 수도 있기 때문에 문제가 된다면 wait으로 처리 할 예정

downloadLocation = "C:\\Users\\DGSW\\Downloads\\"
if newFileName: # 파일명에 변경이 있을 때
    # 파일명 변경
    os.rename(downloadLocation+fileName+".mp3",downloadLocation+newFileName+".mp3")
    # 변경하면 변경된 파일 이름이 파일 이름이 된다
    fileName = newFileName

# 파일명 변경까지 완성

# 파일 이동시키기
# mp3위치
changeLocation = "E:\\all\\"
shutil.move(downloadLocation+fileName+".mp3",changeLocation+fileName+".mp3")


while(1):   
    time.sleep(10)

중간 주석을 보면 알 수 있듯, 위는 대부분 어제(220302) 코드이고, 아래는 오늘(220303) 코드이다

어제 유튜브 url을 입력하면 자동으로 음원추출 후 다운로드하는 과정까지 완성했고,
오늘은 파일을 저장할 입력을 입력받아 입력에 따른(비우면 그대로) 제목 변경을 했고, 파일을 mp3로 이동시키는 과정까지 했다

이제 url, 이름을 입력하면

MP3에 저장이 된다!

뭔가 이렇게 한 번에 보니 오늘 한게 생각보다 없다는 생각이 들긴하다, 사실일 수 있다, 쫌 사적인 이야기를 붙이자면 가족 중 코로나 양성이 떠서 기숙사 학교에 있는 나는 집으로 귀환주문서를 사용했다, 정신이 없었다

앞으로 할 일은 짜잘한 부분(sleep, 다운로드 위치, MP3위치 등)에서 수정과 파이썬-웹 연결이다

느낀점🙃

  • selenium을 내가 내부적으로 제대로 이해하지 못하고 문법만 이해한 상태에서 진행해서 그런지, 아니면 원래 이런 짜잘한 오류가 자주 나는진 몰라도 육아를 하는 느낌이다ㅋㅋ 계속 요소를 찾지 못해 오류가 났던 것 같다

  • 뭔가 입력받을 것을 생각하며 변수를 지정해서그런지 코드를 짜면서도 변수지정을 괜찮게 했다는 생각이 들었고 기분 좋게 코드를 짠 것 같았다, 이런 좋은 변수지정이 필요하다는 생각이 들었고, 이 능력은 경험에 의해 늘거같다는 생각이 들었다

  • 일단 요기서 나의 목표라고 할 수 있는 음원추출, 이름설정 후 저장 자동화를 이뤄냈다, 뭔가 보이는 목표가 있으니 확실히 동기부여가 되는게 느껴진다, 이젠 MP3에 음악 넣을 수 있겠다 ㅎㅎ

profile
괴물신인

0개의 댓글