고등학교를 다닐 때는 체중계에 찍히는 숫자를 학교 성적처럼 여겼다. 그 숫자가 내 가치를 그대로 반영하는 것 같았다. 성적이 잘 나오거나 몸무게가 줄어드는 건 축하할 일이고, 그 반대일 경우에는 타인에게 사랑받고 인정받고자 더 열심히 노력해야 했다. 몸무게를 향한 집착은 대학과 간호학교에 다니면서도, 심지어 간호사로 일하기 시작했을 무렵까지도 계속됐다.
- 해들리 블라호스의 《삶이 흐르는 대로》 중에서 -
* 날마다 체중계를 보며 몸무게를 재는 것도 자기 관리의 핵심입니다. 체중계에 찍히는 숫자에 일희일비합니다. 그러나 몸무게가 절대적인 것은 결코 아닙니다. 젊은이들의 잘못된 가치관은 몸과 마음과 정신을 망가뜨립니다. 무엇이 더 귀하고 가치 있는가를 알지 못하고 소중한 몸을 혹사시키기도 합니다. 건강한 아름다움은 몸의 무게보다 마음의 무게에 있습니다.
The Suples Bulgarian Bag Match is one of the FIRST and ORIGINAL Suples Workouts to date! Although this workout is only 13 minutes long, it is not to be underestimated! Your grip strength and muscular endurance will DEFINITELY be put to the test, as well as your overall WILLPOWER. Remember, in the end, it's all about YOU VS. THE BAG! So, are you ready to win?
Below you will see the full Bulgarian Bag Match written out: *Note: If you complete the assigned sets of exercises before the end of the period, you get bonus rest time!
1st Period: (3 minutes) •10x Suples Spin on Each Side •10x Bent Over Row •10x Swing Squat (Repeat 3x)
(1 minute of rest)
2nd Period: (5 minutes) •5x Lamb Swing on Each Side •10x Suples Spin on Each Side •10x Shoulder Raise Squat (Repeat 3x)
(1 minute of rest)
3rd Period: (3 minutes) •5x Spin Arm Throw Combo •10x Suples Spin on Each Side •10x Suples Snatch (Repeat 3x)
최근에 넷플릭스에서 '새들과 함께 춤을'을 봤는데 무대는 세계에서 두 번째로 큰 섬인 뉴기니섬이고, 그곳에 사는 뇌쇄적인 새들은 기이한 사랑 춤을 춥니다. 암컷을 유혹하는 기술입니다. 수컷은 엉덩이를 시계 방향으로 느릿느릿 돌리며 관능적인 춤을 춥니다. 지성이면 감천입니다. 수컷의 정성이 하늘에 닿아 드디어 짝짓기에 성공합니다. 수컷은 세상에 태어나 처음이자 마지막으로 아버지의 역할을 합니다.
- 정부희의 《곤충은 남의 밥상을 넘보지 않는다》 중에서 -
* 생명의 연속성을 이루는 근간은 종족의 번식일 것입니다. 그를 위해 보이는 본능적 구애 행위는 가상하다 못해 경이롭기까지 합니다. 동물도 사람도 큰 차이가 없습니다. 사랑을 쟁취하고자 하는 노력은 종의 경계를 넘어섭니다. 한 가지 공통점은 '사랑 춤'을 추는 것입니다. 자신의 강점과 매력을 뽐내기 위해 최대한 관능적으로 엉덩이를 흔드는 것입니다.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QLineEdit, QScrollArea, QMessageBox
import yt_dlp
import threading
from moviepy.editor import AudioFileClip
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 윈도우 설정
self.setWindowTitle("YouTube Downloader & MP4 to MP3 Converter")
self.setGeometry(300, 300, 600, 400)
# 메인 레이아웃 설정
self.main_layout = QVBoxLayout()
# 버튼 레이아웃 (좌에서 우로 배치)
button_layout = QHBoxLayout()
# 버튼 1: YouTube URL 다운로드 버튼
self.youtube_button = QPushButton("Download YouTube Video", self)
self.youtube_button.clicked.connect(self.show_youtube_download_form)
button_layout.addWidget(self.youtube_button)
# 버튼 2: MP4 to MP3 변환 버튼
self.convert_button = QPushButton("Convert MP4 to MP3", self)
self.convert_button.clicked.connect(self.confirm_convert_form) # 확인 창 함수 연결
button_layout.addWidget(self.convert_button)
# 버튼 3: Downloads 폴더의 파일 리스트 보기 버튼
self.show_files_button = QPushButton("Show Downloaded Files", self)
self.show_files_button.clicked.connect(self.show_downloaded_files)
button_layout.addWidget(self.show_files_button)
# 버튼 레이아웃 추가
self.main_layout.addLayout(button_layout)
# YouTube URL 입력 필드 (초기에는 숨김)
self.url_input = QLineEdit(self)
self.url_input.setPlaceholderText("Enter YouTube URL here...")
self.url_input.setVisible(False) # 초기에는 숨김
self.main_layout.addWidget(self.url_input)
# 상태 및 결과 표시 레이블 (스크롤 가능)
self.result_label = QLabel(self)
self.result_label.setWordWrap(True)
scroll_area = QScrollArea(self)
scroll_area.setWidgetResizable(True)
scroll_area.setWidget(self.result_label)
self.main_layout.addWidget(scroll_area)
# 메인 레이아웃 설정
self.setLayout(self.main_layout)
def show_youtube_download_form(self):
# 입력 필드가 이미 있는지 확인 후 없을 때만 추가
# 입력 필드를 보이도록 설정하고, 플레이스홀더 텍스트 설정
self.url_input.setVisible(True)
self.url_input.setPlaceholderText("Enter YouTube URL here...")
self.url_input.clear() # 이전 입력값 지우기
self.result_label.setText("Enter a YouTube URL to download:")
def download_video(self):
url = self.url_input.text().strip()
if url:
self.result_label.setText("Downloading... Please wait.")
threading.Thread(target=self.youtube_download_process, args=(url,)).start()
else:
self.result_label.setText("Please enter a valid YouTube URL.")
def youtube_download_process(self, url):
ydl_opts = {
'format': 'best',
'outtmpl': './downloads/%(title)s.%(ext)s',
'progress_hooks': [self.progress_hook]
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
def progress_hook(self, d):
if d['status'] == 'downloading':
percent = d['_percent_str']
speed = d.get('speed', 'Unknown')
eta = d.get('eta', 'Unknown')
self.result_label.setText(f"Downloading: {percent} - Speed: {speed} - ETA: {eta}s")
elif d['status'] == 'finished':
self.result_label.setText(f"Download complete!")
def confirm_convert_form(self):
# 확인/취소 메시지 박스를 생성
reply = QMessageBox.question(self, 'Convert MP4 to MP3',
"Are you sure you want to convert all MP4 files in the folder to MP3?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
# 사용자가 Yes를 선택한 경우에만 변환 함수 실행
if reply == QMessageBox.Yes:
self.show_convert_form()
def show_convert_form(self):
# URL 입력창 숨김
self.url_input.setVisible(False)
# MP4 파일 선택 및 MP3로 변환 메시지 설정
self.result_label.setText("Converting all MP4 files in the folder to MP3...")
threading.Thread(target=self.convert_mp4_to_mp3).start()
def convert_mp4_to_mp3(self):
folder_path = './downloads' # MP4 파일이 있는 폴더
for filename in os.listdir(folder_path):
if filename.endswith(".mp4"):
mp4_path = os.path.join(folder_path, filename)
mp3_path = os.path.join(folder_path, f"{os.path.splitext(filename)[0]}.mp3")
if os.path.exists(mp3_path):
self.result_label.setText(self.result_label.text() + f"\nSkipping {filename}: MP3 already exists.")
continue
audio_clip = AudioFileClip(mp4_path)
audio_clip.write_audiofile(mp3_path)
audio_clip.close()
self.result_label.setText(self.result_label.text() + f"\nConverted: {filename} to MP3.")
self.result_label.setText(self.result_label.text() + "\nAll MP4 files converted to MP3.")
def show_downloaded_files(self):
# URL 입력창 숨김
self.url_input.setVisible(False)
# ./downloads 폴더의 파일 리스트를 표시
folder_path = './downloads'
if not os.path.exists(folder_path):
self.result_label.setText("No files found. The downloads folder does not exist.")
return
files = os.listdir(folder_path)
if files:
file_list = "\n".join(files)
self.result_label.setText(f"Files in {folder_path}:\n{file_list}")
else:
self.result_label.setText("No files found in the downloads folder.")
# PyQt 애플리케이션 실행
if __name__ == "__main__":
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
프리드리히 니체는 1844년에 개신교 목사 집안에서 태어났다. 어린 시절에 그는 이런 집안의 정신을 흠뻑 받아들인 것이 분명하다. 그가 "성서 구절과 종교적 노래들을 하도 훌륭하게 표현해서 듣는 사람이 울음을 터뜨리지 않을 수 없었다"라는 보고도 있다. '꼬마 목사'가 그의 별명이었다. 그러나 소년은 다른 분야에서도 아주 명석했다.
- 빌헬름 바이셰델의 《철학의 뒷계단》 중에서 -
* 어린 시절의 환경은 개인의 역사뿐 아니라 인류의 역사에도 지대한 영향을 미칩니다. 목사의 아들로 태어나 '꼬마 목사'라는 별명을 얻었을 만큼 신실했던 니체가 '신은 죽었다'는 폭탄선언을 했습니다. 왜 그랬을까요? 교회 안에서 자랐던 까닭에 교회의 비신앙적 내면을 더 잘 보았기 때문이 아닐까요?
import os
from pathlib import Path
from moviepy.editor import *
# MP4 파일이 있는 폴더 경로 지정
folder_path = './downloads'
import file_rename_underbar as fru
# 폴더내의 파일명 rename
fru.replace_spaces_in_filenames(folder_path)
# 폴더 내의 모든 파일 확인
for filename in os.listdir(folder_path):
if filename.endswith('.mp4'):
mp4_path = os.path.join(folder_path, filename)
mp3_path = os.path.join(folder_path, filename.replace('.mp4', '.mp3'))
# 비디오에서 오디오 추출 후 MP3로 저장
video = VideoFileClip(mp4_path)
video.audio.write_audiofile(mp3_path)
video.close() # 명시적으로 close 호출하여 자원 해제
print(f"Converted: {filename} to MP3")
else:
print(f"Converted Not: {filename} to MP3")