파이썬 실습/유튜브 새로운 영상 올라오면 알림 및 실시간 다운로드하기

파이썬 유튜브 새로운 영상 올라오면 알림 및 실시간 다운로드하기 - 3.변경 사항 체크하기

파기차차 2023. 6. 9. 21:53
728x90
반응형
SMALL

ㅁ 개요

 

O 프로그램 소개

 

- 이번 글은 이전글(파이썬 유튜브 새로운 영상 올라오면 알림 및 실시간 다운로드하기 - 2.구글 유튜브 API를 이용하여 전체영상 갯수, 제목, URL 알아내기)에 이은 4번째 글로 이전 유튜브채널과 비교하여 새로 추가된 영상만 받을 수 있도록 변경된 부분을 알아내는 방법에 대해서 살펴보겠습니다

 

 

 

 

O 완성된 프로그램 실행 화면

 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다..

 

 

1.첫번째 프로그램을 실행하면 아래와 같이 실행됩니다.

 

프로그램이 동영상 개수를 모니터링하면서 체크하는데, 처음엔 영상갯수의 변화가 없습니다.

 

 

 

시간이 조금 지나 영상을 새로 올리자, 프로그램이 체크하여 동영상 갯수가 증가(1->2개)했음을 알려줍니다.

그리고 다시 2->1개로 영상갯수가 줄어들었음을 알려주고 있습니다.

 

 

 

 

실제 유튜브 사이트에 가서 확인 결과 처음엔 영상이 1개였으나,

 

 

위의 프로그램에서 2개로 변경된 것을 확인 후 유튜브 사이트에 가서 확인 결과 정말로 공개된 영상이 2개로 늘어난 것을 볼 수 있습니다.

 

 

 

 

 

2. 두번째 프로그램 실행결과 아래와 같이 실행됩니다.

 

첫번째 프로그램과 마찬가지로, 프로그램이 동영상 갯수(정확히는 동영상의 제목의 갯수)를 모니터링하면서 체크하고, 처음엔 변화가 없다가 이후 변경사항 발생을 감지합니다.

 

아래에서 보듯이 영상의 제목URL이 처음에 1개(3번)였다가, 2개(4번)로 늘어난 것을 볼 수 있습니다.

 

 

 

 

 

 

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

 

소스 : 3.changeOrNotChange.py

=>전체 동영상 갯수 변경여부를 체크

from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
import time

# 유튜브 데이터 API를 사용하기 위한 API 키
from conf import *


# 채널 ID
CHANNEL_ID = 'UChBYnUkgXUk2rmkQlIMNXNw'
# https://www.youtube.com/channel/UChBYnUkgXUk2rmkQlIMNXNw


# YouTube Data API 클라이언트 생성
youtube = build('youtube', 'v3', developerKey=YOUTUBE_APIKEY)

try:
    # 채널 정보 가져오기
    channel_response = youtube.channels().list(
        part='statistics',
        id=CHANNEL_ID
    ).execute()

    # 전체 동영상 수 출력
    video_count = int(channel_response['items'][0]['statistics']['videoCount'])
    print('전체 동영상 수:', video_count)
    beforeCount = video_count
    print("==========================================================================")

except HttpError as e:
    print('에러 발생:', e)


time.sleep(3)

while True:
    try:
        # 채널 정보 가져오기
        channel_response = youtube.channels().list(
            part='statistics',
            id=CHANNEL_ID
        ).execute()

        # 전체 동영상 수 출력
        video_count = int(channel_response['items'][0]['statistics']['videoCount'])
        print('전체 동영상 수:', video_count)
        afterCount = video_count
        print("==========================================================================")

    except HttpError as e:
        print('에러 발생:', e)

    
    result = afterCount - beforeCount

    if (result):
        print("동영상 개수에 변경이 발생했습니다.")
        print(result)
    else:
        print("동영상 개수에 변경이 발생하지 않았습니다.")
        print(result)

    print("==========================================================================")
    print("###########################################################################\n\n")


    beforeCount = afterCount

    time.sleep(5)

 

소스 : 4.change_Confirm.py

=>전체 동영상 갯수 변경여부 및 추가된 영상의 제목을 체크

from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
import time

# YouTube Data API의 API key를 입력합니다.
from conf import *

# 가져올 채널의 ID를 입력합니다.
channel_id = 'UChBYnUkgXUk2rmkQlIMNXNw'


# YouTube Data API 클라이언트를 빌드합니다.
youtube = build('youtube', 'v3', developerKey=YOUTUBE_APIKEY)


beforeVideos = [] # 현재 비디오 목록 10개

try:
    # 동영상 목록을 가져옵니다.
    request = youtube.search().list(
        part='id,snippet',
        channelId=channel_id,
        order='date',
        type='video',
        maxResults=10
    )
    response = request.execute()
    # print(response)

    # 동영상 제목과 ID를 출력합니다.
    for item in response['items']:
        video_title = item['snippet']['title']
        video_id = item['id']['videoId']
        print(f'{video_title}: {video_id}')
        beforeVideos.append(video_title)
    
    beforeSet = set(beforeVideos) # 현재 비디오 목록 10개, set으로 만들어야 뺄 수 있음
    # print(beforeSet)
    print("==========================================================================")

except HttpError as e:
    print(f'An HTTP error {e.resp.status} occurred:\n{e.content}')



time.sleep(2)

afterVideos = [] # 10초 후 비디오 목록 10개

while True:
# for i in range(0,2):
    try:
        # 동영상 목록을 가져옵니다.
        request = youtube.search().list(
            part='id,snippet',
            channelId=channel_id,
            order='date',
            type='video',
            maxResults=10
        )
        response = request.execute()
        # print(response)

        # 동영상 제목과 ID를 출력합니다.
        for item in response['items']:
            video_title = item['snippet']['title']
            video_id = item['id']['videoId']
            print(f'{video_title}: {video_id}')
            afterVideos.append(video_title)
        
        afterSet = set(afterVideos) # 10초 후 비디오 목록 10개
        # print(afterSet)
        print("==========================================================================")

    except HttpError as e:
        print(f'An HTTP error {e.resp.status} occurred:\n{e.content}')

    
    result = afterSet - beforeSet # afterSet이 많으면 변경발생(즉, 추가되면 변경발생), beforeSet이 많으면 변경 미발생임
    # print(result)

    if (result):
        print("동영상 목록(개수 등)에 변경이 발생했습니다.")
        print("추가된 동영상 : ", result)
        # break
    else:
        print("동영상 목록(개수 등)에 변경이 발생하지 않았습니다.")
        print("동영상 목록 : ", result)
        # break
    
    print("==========================================================================")
    print("###########################################################################\n\n")


    beforeSet = afterSet

    time.sleep(10)

 

 - 소스파일을 cmd, 파워쉘 또는 vscode 등에서 아래와 같이 실행하시기 바랍니다.
 

 

 > python 3.changeOrNotChange.py
 > python 4.change_Confirm.py

 

 

 


 
 

 

O 주요 내용

 

1. 첫번째 소스(3.changeOrNotChange.py)를 간략하게 살펴보겠습니다.

 

소소의 내용은 대부분 이전글(파이썬 유튜브 새로운 영상 올라오면 알림 및 실시간 다운로드하기 - 2.구글 유튜브 API를 이용하여 전체영상 갯수, 제목, URL 알아내기)의 설명과 동일하므로 달라진 주요한 부분만 설명합니다.

 

아래 소스에서는 API 요청/응답으로 전체 영상 갯수를 알아낸 후 이를 beforeCount변수에 할당하고 있습니다.

 

 

 

5초 후에 다시 위와 동일한 과정을 거쳐 동영상의 갯수를 알아내는데, 이를 afterCount변수에 할당합니다.

 

그리고 나서 이후에 알아낸 영상 갯수(afterCount)에서 이전에 알아낸 영상 갯수(beforeCount)의 차이를 확인 후 변화가 없으면(즉, 0(거짓)이면) else구문을 실행하고, 변화가 있으면(즉, 0이 아니면) if구문을 실행합니다.

 

 

 

 

 

 

2. 두번째 소스(4.change_Confirm.py)를 간략하게 살펴보겠습니다.

 

아래에서는 유튜브 API 요청/응답으로 최신 영상 10개의 세부 정보를 가져와서 제목만 뽑아서 beforeVideos[]에 넣은 후 차이를 비교하기 위하여 set()함수로 set타입 형식으로 변환(beforeSet)합니다.

 

 

마찬가지로 20초 후에 위와 동일한 과정을 거쳐 afterSet 변수에 최신 영상 10개의 제목을 넣습니다.

 

변경여부를 확인하기 위해 위의 2개 변수간의 차이를 구하고(line 79)

result가 참이면(즉, 0이 아니므로 변경이 발생한 것임) if구문을 실행하고, 참이 아니면(즉, 0이라는 얘기로 변경사항이 없다는 뜻임) else구문을 실행합니다.

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 이전 유튜브채널과 비교하여 새로 추가된 영상만 받을 수 있도록 변경된 부분을 알아내는 방법에 대해서 살펴보았습니다
 
 - 오늘 우리가 배운 내용을 간략히 정리해 보면 아래와 같습니다.
 > 1.첫번째 소스에서는 아래와 같이 이후에 구한 영상갯수에서 이전에 구한 영상 갯수의 차이가 발생하면 변경이 발생한 것을 감지하였고, 루프내 마지막 부분에 2)와 같이 코딩
1) result = afterCount - beforeCount
2) beforeCount = afterCount

 > 2.두번재 소스에서는 이전, 이후 리스트내 10개의 영상제목간의 차이 비교하기 위해 set()으로 타입 변경 후 차이를 비교하는 부분이 중요

beforeSet = set(beforeVideos) # 현재 비디오 목록 10개, set으로 만들어야 뺄 수 있음
afterSet = set(afterVideos) # 10초 후 비디오 목록 10개

result = afterSet - beforeSet # afterSet이 많으면 변경발생(즉, 추가되면 변경발생), beforeSet이 많으면 변경 미발생임
beforeSet = afterSet

 

 

 

 

오늘은 여기까지이며, 댓글하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.

위의 내용이 유익하셨다면, 댓글과 하트 부탁드립니다.

 

 

 

 

감사합니다.

 

 

 

※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.

 

 

728x90
반응형
LIST