示例#1
0
 def initIntroThread(self):
     self.introObj = IntroWorker()
     self.introThread = QThread()
     self.introObj.moveToThread(self.introThread)
     self.introObj.startMsg.connect(self.showIntroInfo)
     self.introThread.started.connect(self.introObj.playBGM)
     self.introThread.start()
示例#2
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.initAuthLock()
        self.initSignal()
        self.user_id = None
        self.user_pw = None
        self.is_play = False
        self.stream_list = None
        self.stream_size = 0
        self.youtube_obj = None
        self.initIntroThread()


    def initAuthLock(self):
        self.priviewButton.setEnabled(False)
        self.fileNavButton.setEnabled(False)
        self.streamComboBox.setEnabled(False)
        self.startButton.setEnabled(False)
        self.urlTextEdit.setEnabled(False)
        self.pathTextEdit.setEnabled(False)
        self.showStatusMsg('인증 안됨')

    
    def initAuthActive(self):
        self.priviewButton.setEnabled(True)
        self.fileNavButton.setEnabled(True)
        self.streamComboBox.setEnabled(True)
        self.urlTextEdit.setEnabled(True)
        self.pathTextEdit.setEnabled(True)
        self.showStatusMsg('인증 완료')

    
    def showStatusMsg(self, msg):
        self.statusbar.showMessage(msg)

    
    def initSignal(self):
        self.exitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)
        self.loginButton.clicked.connect(self.authCheck)
        self.priviewButton.clicked.connect(self.load_url)
        # the loadProgress() signal is emitted whenever an element of the web view completes loading, such as an embedded image or a script.
        self.webEngineView.loadProgress.connect(self.showProgressBrowserLoading)
        self.fileNavButton.clicked.connect(self.selectDownPath)
        self.startButton.clicked.connect(self.youtube_download)

   
    def initIntroThread(self):
        self.introObject = IntroWorker()
        self.introThread = QThread()
        self.introObject.moveToThread(self.introThread)
        self.introObject.startMsg.connect(self.showIntroInfo)
        self.introThread.started.connect(self.introObject.playBgm)
        self.introThread.start()
示例#3
0
 def initIntroThread(self):
     #Worker선언
     self.introObj = IntroWorker()
     #Qthread 선언
     self.introThread = QThread()
     #Worker To thread 전환
     self.introObj.moveToThread(self.introThread)
     #시그널 연결
     self.introObj.startMsg.connect(self.showIntroInfo)
     #Thread 시작 메소드 연결
     self.introThread.started.connect(self.introObj.playBgm)
     #Thread 스타트
     self.introThread.start()
示例#4
0
    def initIntroThread(self):
        #worker 선언
        self.introObj = IntroWorker()  #인스턴스화
        #Qthread 선언
        self.introThread = QThread()  #pyqt5에서 제공하는 qthread를 인스턴스화

        #우리가 만든 IntroWorker를 Thread로 전환
        self.introObj.moveToThread(
            self.introThread
        )  #moveToThread는 Introworker의 Qobject 에 있고 그렇기 때문에 IntroWorker에서 qobject 상속받음

        #시그널 연결-이부분은 안만들어도되는데 공부할겸 보여주는거(쓰레드와 통신)
        self.introObj.startMsg.connect(self.showIntroInfo)

        #Thread 시작 메소드 연결
        self.introThread.started.connect(self.introObj.playBgm)

        #Thread 스타트버튼
        self.introThread.start()
示例#5
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        #초기화
        self.setupUi(self)
        #초기 잠금
        self.initAuthLock()
        #시그널 초기화
        self.initSignal()
        #로그인 관련 변수 선언
        self.user_id = None
        self.user_pw = None
        #재생 여부
        self.is_play = False
        #Youtube 관련 작업
        self.youtb = None
        self.youtb_fsize = 0
        #배경음악 Thread 작업 선언
        self.initIntroThread()
        #Qthread 사용 안할 경우
        #QSound.play("C:/Django/workspace/python-class1/section6/resource/intro.wav")

    #기본 UI 비활성화
    def initAuthLock(self):
        self.previewButton.setEnabled(False)
        self.fileNavButton.setEnabled(False)
        self.streamCombobox.setEnabled(False)
        self.startButton.setEnabled(False)
        self.calendarWidget.setEnabled(False)
        self.urlTextEdit.setEnabled(False)
        self.pathTextEdit.setEnabled(False)
        self.showStatusMsg('인증안됨')

    #기본 UI 활성화
    def initAuthActive(self):
        self.previewButton.setEnabled(True)
        self.fileNavButton.setEnabled(True)
        self.streamCombobox.setEnabled(True)
        self.calendarWidget.setEnabled(True)
        self.urlTextEdit.setEnabled(True)
        self.pathTextEdit.setEnabled(True)
        self.showStatusMsg('인증 완료')

    def showStatusMsg(self, msg):
        self.statusbar.showMessage(msg)

    #시그널 초기화
    def initSignal(self):
        self.loginButton.clicked.connect(self.authCheck)
        self.previewButton.clicked.connect(self.load_url)
        self.exitButtion.clicked.connect(
            QtCore.QCoreApplication.instance().quit)
        self.webView.loadProgress.connect(self.showProgressBrowserLoading)
        self.fileNavButton.clicked.connect(self.selectDownPath)
        self.calendarWidget.clicked.connect(self.append_date)
        self.startButton.clicked.connect(self.downloadYoutb)

    #인트로 쓰레드 초기화 및 활성화
    def initIntroThread(self):
        #Worker선언
        self.introObj = IntroWorker()
        #Qthread 선언
        self.introThread = QThread()
        #Worker To thread 전환
        self.introObj.moveToThread(self.introThread)
        #시그널 연결
        self.introObj.startMsg.connect(self.showIntroInfo)
        #Thread 시작 메소드 연결
        self.introThread.started.connect(self.introObj.playBgm)
        #Thread 스타트
        self.introThread.start()

    #인트로 쓰레드 Signal 실행
    def showIntroInfo(self, msg, fileName):
        self.plainTextEdit.appendPlainText("Program Started by : " + msg)
        self.plainTextEdit.appendPlainText("Playing intro infomation is : ")
        self.plainTextEdit.appendPlainText(fileName)

    @pyqtSlot()
    def authCheck(self):
        dlg = AuthDialog()
        dlg.exec_()
        self.user_id = dlg.user_id
        self.user_pw = dlg.user_pw

        # 이 부분에서 필요한 경우 실제 로컬 DB 또는 서버 연동 후
        # 유저 정보 및 사용 유효기간을 체크하는 코드를 넣어주세요.
        # code
        # code
        #print("id: %s password: %s" %(self.user_id,self.user_pw))

        if True:
            self.initAuthActive()
            self.loginButton.setText("인증완료")
            self.loginButton.setEnabled(False)
            self.urlTextEdit.setFocus(True)
            self.append_log_msg("login Success")

        else:
            QMessageBox.about(self, "인증오류", "아이디 또는 비밀번호 인증 오류")

    def load_url(self):
        url = self.urlTextEdit.text().strip()
        v = re.compile('^https://www.youtube.com/?')
        if self.is_play:
            self.append_log_msg('Stop Click')
            self.webView.load(QUrl('about:blank'))
            self.previewButton.setText("재생")
            self.is_play = False
            self.urlTextEdit.clear()
            self.urlTextEdit.setFocus(True)
            self.startButton.setEnabled(False)
            self.streamCombobox.clear()
            self.progressBar_2.setValue(0)
            self.showStatusMsg("인증 완료")
        else:
            if v.match(url) is not None:
                self.append_log_msg('Play Click')
                self.webView.load(QUrl(url))
                self.showStatusMsg(url + "재생 중")
                self.previewButton.setText("중지")
                self.is_play = True
                self.startButton.setEnabled(True)
                self.initialYouWork(url)

            else:
                QMessageBox.about(self, "URL 형식오류", "Youtube 주소 형식이 아닙니다.")
                self.urlTextEdit.clear()
                self.urlTextEdit.setFocus(True)

    def initialYouWork(self, url):
        video_list = pytube.YouTube(url)
        #로딩바 계산
        video_list.register_on_progress_callback(self.showProgressDownLoading)
        self.youtb = video_list.streams.all()
        self.streamCombobox.clear()
        for q in self.youtb:
            #print('step1',q.itag,q.mime_type,q.abr)
            tmp_list, str_list = [], []
            tmp_list.append(str(q.mime_type or ''))
            tmp_list.append(str(q.res or ''))
            tmp_list.append(str(q.fps or ''))
            tmp_list.append(str(q.abr or ''))

            #print('step_2',tmp_list)
            str_list = [x for x in tmp_list if x != '']
            #print('step3',str_list)
            print('join', ','.join(str_list))
            self.streamCombobox.addItem(','.join(str_list))

    def append_log_msg(self, act):
        now = datetime.datetime.now()
        nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S')
        app_msg = self.user_id + ' : ' + act + ' - (' + nowDatetime + ')'
        print(app_msg)
        self.plainTextEdit.appendPlainText(app_msg)  #insertPlainText

        #활동 로그 저장(또는 DB를 사용 추천)
        with open('txt 저장 경로 입력', 'a') as f:
            f.write(app_msg + '\n')

    @pyqtSlot(int)
    def showProgressBrowserLoading(self, v):
        self.progressBar.setValue(v)

    @pyqtSlot()
    def selectDownPath(self):
        #파일선택
        #fname = QFileDialog.getOpenFileName(self)
        #self.pathTextEdit.setText(fname[0])

        #경로선택
        fpath = QFileDialog.getExistingDirectory(self, 'Select Directory')
        self.pathTextEdit.setText(fpath)

    @pyqtSlot()
    def append_date(self):
        cur_date = self.calendarWidget.selectedDate()
        #print('click date', self.calendarWidget.selectedDate().toString())
        print(
            str(cur_date.year()) + '-' + str(cur_date.month()) + '-' +
            str(cur_date.day()))
        self.append_log_msg('Calendar Click')

    @pyqtSlot()
    def downloadYoutb(self):
        down_dir = self.pathTextEdit.text().strip()
        if down_dir is None or down_dir == '' or not down_dir:
            QMessageBox.about(self, '경로 선택', '다운로드 받을 경로를 선택하세요.')
            return None

        self.youtb_fsize = self.youtb[
            self.streamCombobox.currentIndex()].filesize
        #print('fsize',self.youtb_fsize)
        self.youtb[self.streamCombobox.currentIndex()].download(down_dir)
        self.append_log_msg('Download Click')

    def showProgressDownLoading(self, stream, chunk, finle_handle,
                                bytes_remaining):
        #print(int(self.youtb_fsize - bytes_remaining))
        #print('bytes_remaining',bytes_remaining)
        self.progressBar_2.setValue(
            int(((self.youtb_fsize - bytes_remaining) / self.youtb_fsize) *
                100))
示例#6
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()

        self.user_id = None
        self.user_pw = None
        self.is_playing = False
        self.youtube = None
        self.youtube_fsize = 0

        QSound.play('./resource/intro.wav')

        self.setupUi(self)
        self.initAuth()
        self.initSignal()
        self.initIntroThread()

    def initAuth(self):
        self.previewBtn.setEnabled(False)
        self.fileNavBtn.setEnabled(False)
        self.qualityCB.setEnabled(False)
        self.downloadBtn.setEnabled(False)
        self.calendarWidget.setEnabled(False)
        self.urlLE.setEnabled(False)
        self.pathLE.setEnabled(False)
        self.showStatusMsg('Not Authenticated')

    def activateAuth(self):
        self.previewBtn.setEnabled(True)
        self.fileNavBtn.setEnabled(True)
        self.qualityCB.setEnabled(True)
        self.calendarWidget.setEnabled(True)
        self.urlLE.setEnabled(True)
        self.pathLE.setEnabled(True)
        self.showStatusMsg('Authenticated')

    @pyqtSlot()
    def checkAuth(self):
        dialog = AuthDialog()
        dialog.exec_()
        self.user_id = dialog.user_id
        self.user_pw = dialog.user_pw

        if True:
            self.activateAuth()
            self.loginBtn.setText('Authentication Succeed')
            self.loginBtn.setEnabled(False)
            self.urlLE.setFocus(True)
            self.appendLogMsg('Successfully login')
        else:
            QMessageBox.about(self, 'Failed to authenticate',
                              'Wrong ID or password')

    def initSignal(self):
        self.loginBtn.clicked.connect(self.checkAuth)
        self.previewBtn.clicked.connect(self.loadUrl)
        self.endBtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
        self.webView.loadProgress.connect(self.showProgressBrowserLoading)
        self.fileNavBtn.clicked.connect(self.selectDownPath)
        self.calendarWidget.clicked.connect(self.logCalender)
        self.downloadBtn.clicked.connect(self.downloadYoutube)

    def loadUrl(self):
        url = self.urlLE.text().strip()
        v = re.compile('^https://www.youtube.com/?')
        if self.is_playing:
            self.appendLogMsg('Clicked Stop button')
            self.webView.load(QUrl('about:blank'))
            self.previewBtn.setText('Play')
            self.is_playing = False
            self.urlLE.clear()
            self.urlLE.setFocus(True)
            self.downloadBtn.setEnabled(False)
            self.qualityCB.clear()
            self.progressBar_2.setValue(0)
            self.showStatusMsg('Authenticated')
        else:
            if v.match(url) is not None:
                self.appendLogMsg('Clicked Play button')
                self.webView.load(QUrl(url))
                self.showStatusMsg(url + ' is playing')
                self.previewBtn.setText('Stop')
                self.is_playing = True
                self.downloadBtn.setEnabled(True)
                self.initYoutube(url)
            else:
                QMessageBox.about(self, 'Not available URL',
                                  'It is not a youtube URL.')
                self.urlLE.clear()
                self.urlLE.setFocus(True)

    def initYoutube(self, url):
        video_list = pytube.YouTube(url)
        video_list.register_on_progress_callback(
            self.showProgressDownloadLoading)
        self.youtube = video_list.streams.all()
        self.qualityCB.clear()
        for q in self.youtube:
            temp_list, str_list = [], []
            temp_list.append(str(q.mime_type or ''))
            temp_list.append(str(q.res or ''))
            temp_list.append(str(q.fps or ''))
            temp_list.append(str(q.abr or ''))
            str_list = [x for x in temp_list if x != '']
            self.qualityCB.addItem(', '.join(str_list))

    def initIntroThread(self):
        self.introObj = IntroWorker()
        self.introThread = QThread()
        self.introObj.moveToThread(self.introThread)
        self.introObj.startMsg.connect(self.showIntroInfo)
        self.introThread.started.connect(self.introObj.playBGM)
        self.introThread.start()

    def showIntroInfo(self, username, filename):
        self.logPTE.appendPlainText('Program started by : ' + username)
        self.logPTE.appendPlainText('Playing intro is : ' + filename)

    @pyqtSlot()
    def downloadYoutube(self):
        down_path = self.pathLE.text().strip()
        if down_path is None or down_path == '' or not down_path:
            QMessageBox.about(self, 'Select Path', 'Select path to download')
            return None

        self.youtube_fsize = self.youtube[
            self.qualityCB.currentIndex()].filesize
        self.youtube[self.qualityCB.currentIndex()].download(down_path)
        self.appendLogMsg('Clicked Download button')

    @pyqtSlot()
    def selectDownPath(self):
        fpath = QFileDialog.getExistingDirectory(self, 'Select Directory')
        self.pathLE.setText(fpath)

    @pyqtSlot()
    def logCalender(self):
        cur_date = self.calendarWidget.selectedDate()
        self.appendLogMsg('Clicked calendar : ' + str(cur_date.year()) + '-' +
                          str(cur_date.month()) + '-' + str(cur_date.day()))

    @pyqtSlot(int)
    def showProgressBrowserLoading(self, v):
        self.progressBar.setValue(v)

    @pyqtSlot(int)
    def showProgressDownloadLoading(self, stream, chunk, file_handler,
                                    bytes_remaining):
        self.progressBar_2.setValue(
            int(((self.youtube_fsize - bytes_remaining) / self.youtube_fsize) *
                100))

    def showStatusMsg(self, msg):
        self.statusbar.showMessage(msg)

    def appendLogMsg(self, act):
        now = datetime.datetime.now()
        nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S')
        msg = '[' + nowDatetime + '] ' + self.user_id + ' : ' + act
        self.logPTE.appendPlainText(msg)

        with open('./log.txt', 'a') as f:
            f.write(msg + '\n')
示例#7
0
class Main(QMainWindow, Ui_MainWindow):
    #Qmainwindow를 상송받고, Ui_MainWindow 경로 가져와
    def __init__(self):
        super().__init__()

        #초기화
        self.setupUi(self)

        #초기잠금
        self.initAuthLock()  #인증안누르면 잠금 안풀리는거 --당근 함수로 넘어가면됨

        #시그널 초기화
        self.initSignal()

        #로그인 관련 전역변수 선언
        self.user_id = None
        self.user_pw = None
        #재생 여부 flag 전역번수 만들기
        self.is_play = False  #처음엔 상영중이 아닐태니 아님

        #Youtube 관련작업 변수 지정
        self.youtb = None
        self.youtb_fsize = 0

        #배경음악 Thread 작업 선언
        #vvvQthread 사용 안할경우
        #QSound.play("C:/Users/c8964/Desktop/webcrowling/Section6/resource/intro.wav")  #--> 이렇게하면 메인쓰레드 걸리면 노래가 멈춤 따라서 쓰레드 필요
        self.initIntroThread()

##기본 UI 비활성화

    def initAuthLock(self):  #잠금에대한 함수를 여기다 짜주면돼
        self.previewButton.setEnabled(
            False
        )  # 위에보면 Ui_MainWindow 상속받았기 때문에 가능하다. setenable이 false이므로 잠금이 걸려있다.
        self.fileNavButton.setEnabled(False)
        self.streamCombobox.setEnabled(False)
        self.startButton.setEnabled(False)
        self.calendarWidget.setEnabled(False)
        self.urlTextEdit.setEnabled(False)
        self.pathTextEdit.setEnabled(False)
        self.showStatusMsg('인증안됨')  #이거에대한것도 함수로 아래만들어주겟지
##기본 UI 활성화

    def initAuthActive(self):
        self.previewButton.setEnabled(True)
        self.fileNavButton.setEnabled(True)
        self.streamCombobox.setEnabled(True)
        ##self.startButton.7setEnabled(True) 시작버튼이므로 얘는 우선 빼자 왜냐면 뭐 url 넣어야 시작이 활성화되는게 나으니까!
        self.calendarWidget.setEnabled(True)
        self.urlTextEdit.setEnabled(True)
        self.pathTextEdit.setEnabled(True)
        self.showStatusMsg('인증완료')

    def showStatusMsg(self, msg):  ##status 상태 보여주는거
        self.statusbar.showMessage(msg)

    #시그널 초기화
    def initSignal(self):
        self.loginButton.clicked.connect(self.authCheck)
        self.previewButton.clicked.connect(
            self.load_url)  #확인버튼 누르면 url 띄우는 시그널 만들어보자
        self.exitButton.clicked.connect(
            QtCore.QCoreApplication.instance().quit)  #종료버튼 누르면 꺼지는거
        self.webEngineView.loadProgress.connect(
            self.showProgressBrowserLoading)
        self.fileNavButton.clicked.connect(self.selectDownPath)
        self.calendarWidget.clicked.connect(self.append_date)
        self.startButton.clicked.connect(self.downloadYoutb)

    #인트로 쓰레드 초기화 및 활성화
    def initIntroThread(self):
        #worker 선언
        self.introObj = IntroWorker()  #인스턴스화
        #Qthread 선언
        self.introThread = QThread()  #pyqt5에서 제공하는 qthread를 인스턴스화

        #우리가 만든 IntroWorker를 Thread로 전환
        self.introObj.moveToThread(
            self.introThread
        )  #moveToThread는 Introworker의 Qobject 에 있고 그렇기 때문에 IntroWorker에서 qobject 상속받음

        #시그널 연결-이부분은 안만들어도되는데 공부할겸 보여주는거(쓰레드와 통신)
        self.introObj.startMsg.connect(self.showIntroInfo)

        #Thread 시작 메소드 연결
        self.introThread.started.connect(self.introObj.playBgm)

        #Thread 스타트버튼
        self.introThread.start()

    #인트로 쓰레드 signal 발생
    def showIntroInfo(self, userName, fileName):
        self.plainTextEdit.appendPlainText("Program Started by : " + userName)
        self.plainTextEdit.appendPlainText("Playing intro information is : ")
        self.plainTextEdit.appendPlainText(fileName)

    @pyqtSlot(
    )  #이게 있으면 이 함수가 slot인걸 알려주는 알림문-외국 유명프로그램은 이거 다표기해놈-이게 있고 없고 차이가 좀있는데 나중에 언젠가 알게될거래..공부열심히하면 ㅠ
    def authCheck(self):
        dlg = AuthDialog()
        dlg.exec_()  #누르면 새창으로 띄우는거
        self.user_id = dlg.user_id  ##개씹중요... 클래스 강의 다시들으면서 생각해봐
        #내가 좀 정리해보자면.. AuthDialog에 self로 dlg 넘겻고 그로인해 저장된 변수 dlg.user_id가 여기 변수로 로딩된것.
        self.user_pw = dlg.user_pw

        # 이 부분에서 필요한 경우 실제 로컬 DB 또는 서버 연동 후
        # 유저 정보 및 사용 유효기간을 체크하는 코드를 넣어주세요.
        # code
        # code-하지만 이건 main.py 에서 구현하느게 낫다. 왜냐면 여기는 딱 로그인하는 부분에 대한 py이므로 더 객체지향형
        #print('id: %s pw: %s' %(self.user_id,self.user_pw)) 이걸로 확인해보면됨

        if True:
            self.initAuthActive()
            self.loginButton.setText("인증완료")
            self.loginButton.setEnabled(False)  #로그인박스 누르고나면 인증완료로 바꾸고 디스에이블
            self.urlTextEdit.setFocus(True)
            self.append_log_msg("login Success")
        else:
            QMessageBox.about(self, "인증오류",
                              "아이디 또는 비밀번호 인증 오류")  #두번재칸은 메세지창의 타이틀 세번쩨칸은 내용

    def load_url(self):
        url = self.urlTextEdit.text().strip()
        v = re.compile('^https://www.youtube.com/?')
        if self.is_play:  #재생눌러서 영상중일때 is_play =True되고 그상태에서 stop 만들어줘야함 누르면 아래것들 실행된단소리
            self.append_log_msg('Stop Click')
            self.webEngineView.load(QUrl("about:blank"))
            self.previewButton.setText("재생")
            self.is_play = False
            self.urlTextEdit.clear()
            self.urlTextEdit.setFocus(True)
            self.startButton.setEnabled(False)
            self.streamCombobox.clear()
            self.progressBar_2.setValue(0)
            self.showStatusMsg("인증완료")
        else:
            if v.match(
                    url
            ) is not None:  #또 if쓰는이유는 유튜브 url이 아니라 다른거 쓸까 v정규식 과 matching 됫을때 none값이 아니면 정확히 매칭됫단소리
                self.append_log_msg('Play Click')
                self.webEngineView.load(QUrl(url))
                self.showStatusMsg(url + "재생 중")
                self.previewButton.setText("중지")
                self.is_play = True
                self.startButton.setEnabled(True)  # 이제 스타트버튼 켜줘야지
                self.initialYouWork(url)  #pytube 쓰는거 함수 쓰기

            else:  #사용자가 이상한 주소 넣을경우
                QMessageBox.about(self, "URL 형식오류", "Youtube 주소형식이 아닙니다.")
                self.urlTextEdit.clear()
                self.urlTextEdit.setFocus(True)

    def initialYouWork(self, url):  #pytube 참조 section2
        video_list = pytube.YouTube(url)
        #로딩바 계산
        video_list.register_on_progress_callback(
            self.showProgressDownLoading)  #pytube 고유 메서드임

        self.youtb = video_list.streams.all()
        self.streamCombobox.clear()
        for q in self.youtb:
            tmp_list, str_list = [], []
            tmp_list.append(str(q.mime_type or ''))  #있으면 출력하고 없으면 공백
            tmp_list.append(str(q.res or ''))
            tmp_list.append(str(q.fps or ''))
            tmp_list.append(str(q.abr or ''))

            #print(tmp_list) #이렇게 출력하면 공백들 다 보임
            str_list = [x for x in tmp_list
                        if x != '']  #tmp_list 순회하면서 공백이 아닌거만 넣어
            #print(str_list)
            #####콤보박스 넣어주자 이제 ####
            self.streamCombobox.addItem(','.join(str_list))
            ###########################

    def append_log_msg(self, act):  # 공통으로 쓰기때문에 들여쓰기 한번나와야함
        now = datetime.datetime.now()
        nowDatetime = now.strftime("%Y-%m-%d %H:%M:%S")
        app_msg = self.user_id + ' : ' + act + ' -(' + nowDatetime + ')'
        print(app_msg)
        self.plainTextEdit.appendPlainText(app_msg)  #insertPlainText는 줄바꿈없음

        #활동 로그 저장(또는 DB를 사용 추천)
        with open('C:/Users/c8964/Desktop/webcrowling/Section6/log/log.txt',
                  'a') as f:  #쓸때마다 누적이되니까 'w'가 아니라 'a'-append
            f.write(app_msg + '\n')

    @pyqtSlot(int)
    def showProgressBrowserLoading(self, v):
        self.progressBar.setValue(v)

    @pyqtSlot()
    def selectDownPath(self):
        #파일선택-경로선택이아니라 뭔가 열기위한 파일을 선택하는법
        #fname=QFileDialog.getOpenFileName(self)
        #self.pathTextEdit.setText(fname[0])

        #파일경로
        fpath = QFileDialog.getExistingDirectory(self, 'Select Directory')
        self.pathTextEdit.setText(fpath)

    @pyqtSlot()  #달력을 쓰는법
    def append_date(self):
        cur_date = self.calendarWidget.selectedDate()
        #print('click date',self.calendarWidget.selectedDate().toString())
        #print('cur_date',cur_date)
        print(
            str(cur_date.year()) + '-' + str(cur_date.month()) + '-' +
            str(cur_date.day()))
        self.append_log_msg('Calendar Click')

    @pyqtSlot()
    def downloadYoutb(self):
        down_dir = self.pathTextEdit.text().strip()  #text로 가져와서 공백제거
        if down_dir is None or down_dir == '' or not down_dir:
            QMessageBox.about(self, '경로선택',
                              '다운로드 받을 경로를 선택하세요.')  ##경로선택은 툴팁, 세번째거가 메인 텍스트문
            return None

        self.youtb_fsize = self.youtb[
            self.streamCombobox.currentIndex()].filesize  #파일사이즈 인텍스
        print('fsize', self.youtb_fsize)
        self.youtb[self.streamCombobox.currentIndex()].download(down_dir)
        self.append_log_msg('Download Click')


#다운로드 로딩바 계산 100 -> 90 80 70 - - - - 10 0

    def showProgressDownLoading(self, stream, chunk, finle_handle,
                                bytes_remaining):
        print(int(self.youtb_fsize - bytes_remaining))
        print('bytes_remaining', bytes_remaining)
        self.progressBar_2.setValue(
            int(((self.youtb_fsize - bytes_remaining) / self.youtb_fsize) *
                100))
示例#8
0
class Main(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        #초기화
        self.setupUi(self)
        #초기잠금
        self.initAuthLock()
        #시그널 초기화
        self.initSignal()
        #로그인 관련 변수 선언
        self.user_id = None
        self.user_pw = None
        #재생 여부 확인
        self.is_play = False
        #Youtube 관련 작업
        self.youtb = None
        self.youtb_fsize = 0
        #배경음악 Thread 작업 선언
        self.initIntroThread()
        #Qthread 사용안할 경우
        #QSound.play('c:/PythonApp/Section6/resource/intro.wav')

    #기본 UI 비활성화
    def initAuthLock(self):
        self.previewButton.setEnabled(False)
        self.fileNavButton.setEnabled(False)
        self.streamCombobox.setEnabled(False)
        self.startButton.setEnabled(False)
        self.calendarWidget.setEnabled(False)
        self.urlTextEdit.setEnabled(False)
        self.pathTextEdit.setEnabled(False)
        self.showStatusMsg('인증안됨')

    #기본 UI 비활성화
    def intiAuthActive(self):
        self.previewButton.setEnabled(True)
        self.fileNavButton.setEnabled(True)
        self.streamCombobox.setEnabled(True)
        self.calendarWidget.setEnabled(True)
        self.urlTextEdit.setEnabled(True)
        self.pathTextEdit.setEnabled(True)
        self.showStatusMsg('인증완료')

    def showStatusMsg(self, msg):
        self.statusbar.showMessage(msg)

    def initSignal(self):
        self.loginButton.clicked.connect(self.authCheck)
        self.previewButton.clicked.connect(self.load_url)
        self.exitButton.clicked.connect(
            QtCore.QCoreApplication.instance().quit)
        self.webEngineView.loadProgress.connect(self.showProgressBrowerLoding)
        self.fileNavButton.clicked.connect(self.selectDownPath)
        self.calendarWidget.clicked.connect(self.appendDate)
        self.startButton.clicked.connect(self.downloadYoutube)

    #인트로 쓰레드 초기화 및 비활성화
    def initIntroThread(self):
        #Worker 선언
        self.introObject = IntroWorker()
        #Qthread 선언
        self.introThread = QThread()
        #Worker To Thread 전환
        self.introObject.moveToThread(self.introThread)
        #시그널 연결
        self.introObject.StartMsg.connect(self.showIntroInfo)
        #Thread 시작 메소드 연결
        self.introThread.started.connect(self.introObject.PlayBGM)
        #Thread 스타트
        self.introThread.start()

    def showIntroInfo(self, userName, fileName):
        self.plainTextEdit.appendPlainText('Program Started by : ' + userName)
        self.plainTextEdit.appendPlainText('Playing Intro Infomation is : ')
        self.plainTextEdit.appendPlainText(fileName)

    @pyqtSlot()
    def authCheck(self):
        dlg = AuthDialog()
        dlg.exec_()
        self.user_id = dlg.user_id
        self.user_pw = dlg.user_pw
        if True:
            self.intiAuthActive()
            self.loginButton.setText('인증완료')
            self.loginButton.setEnabled(False)
            self.urlTextEdit.setFocus(True)
            self.append_log_msg('Login Success')
        else:
            QMessageBox.about(self, '인증오류', 'ID 또는 PW 인증오류')

    def load_url(self):
        url = self.urlTextEdit.text().strip()
        v = re.compile('^https://www.youtube.com/?')
        if self.is_play:
            self.append_log_msg('Stop Click')
            self.webEngineView.load(QUrl('about:blank'))
            self.previewButton.setText('재생')
            self.is_play = False
            self.urlTextEdit.clear()
            self.urlTextEdit.setFocus()
            self.startButton.setEnabled(False)
            self.streamCombobox.clear()
            self.progressBar_2.set_Value(0)
            self.showStatusMsg('인증 완료')
        else:
            if v.match(url) is not None:
                self.append_log_msg('Play Click')
                self.webEngineView.load(QUrl(url))
                self.showStatusMsg(url + ' 재생 중')
                self.previewButton.setText('중지')
                self.is_play = True
                self.startButton.setEnabled(True)
                self.initalYouWork(url)
            else:
                QMessageBox.about(self, 'URL 형식오류', 'Youtube 주소 형식이 아닙니다.')
                self.urlTextEdit.clear()
                self.urlTextEdit.setFocus(True)

    def initalYouWork(self, url):
        video_list = pytube.YouTube(url)
        #로딩바 계산
        video_list.register_on_progress_callback(self.showProgressDownLoding)
        self.youtb = video_list.streams.all()
        self.streamCombobox.clear()
        for q in self.youtb:
            #print(q.itag,q.resolution)
            tmp_list, str_list = [], []
            tmp_list.append(str(q.mime_type or ''))
            tmp_list.append(str(q.resolution or ''))
            tmp_list.append(str(q.fps or ''))
            tmp_list.append(str(q.abr or ''))
            str_list = [x for x in tmp_list if x != '']  #공백제거 제네레이터
            #print('step3',str_list)

            self.streamCombobox.addItem(','.join(str_list))  #조인함수 기본함수

    @pyqtSlot(int)
    def showProgressBrowerLoding(self, v):
        self.progressBar.setValue(v)

    def showProgressDownLoding(self, stream, chunk, bytes_remaining):
        self.progressBar_2.setValue(
            int(((self.youtb_fsize - bytes_remaining) / self.youtb_fsize) *
                100))

    @pyqtSlot()
    def selectDownPath(self):
        #파일 선택
        #fname=QFileDialog.getOpenFileName(self)
        #self.pathTextEdit.setText(fname[0])
        #경로 선택
        fpath = QFileDialog.getExistingDirectory(self, 'Select Directory')
        self.pathTextEdit.setText(fpath)

    @pyqtSlot()
    def appendDate(self):
        cur_date = self.calendarWidget.selectedDate()
        #년월일print('click date',self.calendarWidget.selectedDate().toString())
        #print(str(cur_date.year())+'-'+str(cur_date.month())+'-'+str(cur_date.day()))
        self.append_log_msg('Calendar Click')

    @pyqtSlot()
    def downloadYoutube(self):
        down_dir = self.pathTextEdit.text().strip()
        if down_dir is None or down_dir == '' or not down_dir:
            QMessageBox.about(self, '경로선택', '다운로드 받을 경로를 선택하세요')
            self.pathTextEdit.setFocus(True)
            return

        self.youtb_fsize = self.youtb[
            self.streamCombobox.currentIndex()].filesize  #파일 사이즈 리턴
        print(self.youtb_fsize)

        self.youtb[self.streamCombobox.currentIndex()].download(down_dir)
        self.append_log_msg('Download Click')

    def append_log_msg(self, act):
        now = datetime.datetime.now()
        notDatetime = now.strftime('%Y-%m-%d %H:%M:%S')
        app_msg = self.user_id + ' : ' + act + '-(' + notDatetime + ')'
        print(app_msg)
        self.plainTextEdit.appendPlainText(app_msg)

        #활동 로그 저장
        with open('c:/PythonApp/Section6/log/log.txt', 'a') as f:
            f.write(app_msg + '\n')