Info

  • Author : 천용희 (Yonghee Cheon)
  • Link : https://github.com/yonghee12/youtube_alram_clock
  • 니즈 : 유튜브 음악으로 상쾌하게 깨고 싶다
  • 개발이유 : 유사한 코드가 있을 것으로 생각하였으나 맘에 드는 코드가 없어 직접 작성
  • 특징 : 목표 시간 대비 남은 시간을 비교하여 효율적인 시간 비교
  • 추후 계획
    • 볼륨 조정
    • 음악 셔플링

import datetime as dt
import os
import webbrowser
from datetime import datetime as dtt
from time import sleep

from config import links


def get_input_time():
    hour = input("시간을 입력하세요: ")
    minute = (input('분을 입력하세요: '))
    assert int(hour) in range(0, 25)
    assert int(minute) in range(0, 61)
    return ':'.join([hour.zfill(2), minute.zfill(2)])


def get_alarm_time(input_time: str):
    tz_kst = dt.timezone(dt.timedelta(hours=9))
    now = dtt.now(tz_kst)
    time = dtt.strptime(input_time, '%H:%M').time()
    alarm_time = dtt.combine(now, time, tzinfo=tz_kst)
    if alarm_time < now:
        alarm_time += dt.timedelta(days=1)
    return alarm_time


def get_check_duration(target, timezone):
    now = dtt.now(timezone)
    delta = target - now
    delta = delta.seconds
    if delta > 3600:
        return 'hour'
    elif delta > 600:
        return '5-minute'
    elif delta > 300:
        return 'minute'
    elif 300 > delta > 30:
        return 'second'
    else:
        return 'now'


def open_url(url):
    webbrowser.open_new(url)


class YoutubeAlarmClock:
    durations = {
        'hour': 3600,
        '5-minute': 300,
        'minute': 60,
        'second': 1
    }

    def __init__(self):
        input_time = get_input_time()
        self.browser = 'Google Chrome'
        self.tz = dt.timezone(dt.timedelta(hours=9))
        self.alarm_time = get_alarm_time(input_time)
        if dtt.now(self.tz).date() < self.alarm_time.date():
            start = 0
        else:
            delta = dtt.now(self.tz) - dtt.combine(dtt.now(self.tz), dt.time(), tzinfo=self.tz)
            start = delta.seconds
        self.lullaby = f'https://youtu.be/9IbQi4qZzh4?t={start}'
        self.alarm = links['alarm']
        self.check_duration = get_check_duration(self.alarm_time, self.tz)
        print(f"alarm time: {self.alarm_time}")
        print(f"check dura: {self.check_duration}")
        self.play_lullaby()
        self.alarm_main()

    def alarm_main(self):
        while True:
            if self.check_duration == 'now':
                self.stop_lullaby()
                self.play_alarm()
                break

            duration = self.durations[self.check_duration]
            sleep(duration)
            now = dtt.now(self.tz)
            print(now.time().strftime("%H:%M"))
            self.set_check_duration()
            print(self.check_duration)

    def kill_browser(self):
        os.system(f"killall -9 '{self.browser}'")

    def set_check_duration(self):
        self.check_duration = get_check_duration(self.alarm_time, self.tz)

    def play_lullaby(self):
        self.kill_browser()
        open_url(self.lullaby)

    def stop_lullaby(self):
        self.kill_browser()

    def play_alarm(self):
        open_url(self.alarm)