Xudong Xiao commited on
Commit
7df592d
1 Parent(s): f1ae450

Flask API & YoutubeTask class

Browse files

Former-commit-id: 209a92dc549e6b55c68d8cf3fde376d6b53d149a

Files changed (2) hide show
  1. src/task.py +39 -24
  2. src/web/web.py +28 -0
src/task.py CHANGED
@@ -53,9 +53,12 @@ class TaskStatus(Enum):
53
  OUTPUT_MODULE = (auto(), None)
54
 
55
 
 
56
  class Task:
57
  def __init__(self, task_id, task_local_dir, launch_info):
 
58
  openai.api_key = getenv("OPENAI_API_KEY")
 
59
  self.task_local_dir = task_local_dir
60
  self.model = launch_info["model"]
61
  self.gpu_status = 0
@@ -63,34 +66,14 @@ class Task:
63
  self.task_id = task_id
64
  self.progress = NotImplemented
65
  self.SRT_Script = None
66
-
67
 
68
  @staticmethod
69
  def fromYoutubeLink(youtube_url, task_id, launch_info):
70
  # convert to audio
71
- local_dump = Path(launch_info['local_dump'])# should get from launch config
72
- yt = YouTube(youtube_url)
73
- video = yt.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()
74
-
75
- if video:
76
- video.download(str(local_dump.joinpath(f"task_{task_id}")), filename=f"task_{task_id}.mp4")
77
- logging.info(f'Video download completed to {local_dump.joinpath(f"task_{task_id}")}!')
78
- else:
79
- raise FileNotFoundError(f"Video stream not found for link {youtube_url}")
80
-
81
- audio = yt.streams.filter(only_audio=True).first()
82
- if audio:
83
- audio.download(str(local_dump.joinpath(f"task_{task_id}")), filename=f"task_{task_id}.mp3")
84
- logging.info(f'Audio download completed to {local_dump.joinpath(f"task_{task_id}")}!')
85
- else:
86
- logging.info("download audio failed, using ffmpeg to extract audio")
87
- subprocess.run(['ffmpeg', '-i', local_dump.joinpath(f"task_{task_id}").joinpath(f"task_{task_id}.mp4"), '-f', 'mp3', '-ab', '192000', '-vn', local_dump.joinpath(f"task_{task_id}").joinpath(f"task_{task_id}.mp3")])
88
- logging.info("audio extraction finished")
89
-
90
- logging.info("Task Creation Complete.")
91
  logging.info("Task Creation method: Youtube Link")
92
-
93
- return Task(task_id, local_dump.joinpath(f"task_{task_id}"), launch_info)
94
 
95
  @staticmethod
96
  def fromAudioFile():
@@ -133,4 +116,36 @@ class Task:
133
  self.translation()
134
  self.postprocess()
135
  out = self.output_render()
136
- return out
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  OUTPUT_MODULE = (auto(), None)
54
 
55
 
56
+
57
  class Task:
58
  def __init__(self, task_id, task_local_dir, launch_info):
59
+ self.status = TaskStatus.CREATED
60
  openai.api_key = getenv("OPENAI_API_KEY")
61
+ self.launch_info = launch_info
62
  self.task_local_dir = task_local_dir
63
  self.model = launch_info["model"]
64
  self.gpu_status = 0
 
66
  self.task_id = task_id
67
  self.progress = NotImplemented
68
  self.SRT_Script = None
69
+
70
 
71
  @staticmethod
72
  def fromYoutubeLink(youtube_url, task_id, launch_info):
73
  # convert to audio
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  logging.info("Task Creation method: Youtube Link")
75
+ local_dump = Path(launch_info['local_dump']) # should get from launch config
76
+ return YoutubeTask(task_id, local_dump.joinpath(f"task_{task_id}"), launch_info, youtube_url)
77
 
78
  @staticmethod
79
  def fromAudioFile():
 
116
  self.translation()
117
  self.postprocess()
118
  out = self.output_render()
119
+ return out
120
+
121
+ class YoutubeTask(Task):
122
+ def __init__(self, task_id, task_local_dir, launch_info, youtube_url):
123
+ super().__init__(task_id, task_local_dir, launch_info)
124
+ self.youtube_url = youtube_url
125
+
126
+ def run(self):
127
+ yt = YouTube(self.youtube_url)
128
+ local_dump = self.task_local_dir
129
+ video = yt.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()
130
+
131
+ if video:
132
+ video.download(str(local_dump.joinpath(f"task_{self.task_id}")), filename=f"task_{self.task_id}.mp4")
133
+ logging.info(f'Video download completed to {local_dump.joinpath(f"task_{self.task_id}")}!')
134
+ else:
135
+ raise FileNotFoundError(f"Video stream not found for link {self.youtube_url}")
136
+
137
+ audio = yt.streams.filter(only_audio=True).first()
138
+ if audio:
139
+ audio.download(str(local_dump.joinpath(f"task_{self.task_id}")), filename=f"task_{self.task_id}.mp3")
140
+ logging.info(f'Audio download completed to {local_dump.joinpath(f"task_{self.task_id}")}!')
141
+ else:
142
+ logging.info("download audio failed, using ffmpeg to extract audio")
143
+ subprocess.run(
144
+ ['ffmpeg', '-i', local_dump.joinpath(f"task_{self.task_id}").joinpath(f"task_{self.task_id}.mp4"), '-f', 'mp3',
145
+ '-ab', '192000', '-vn', local_dump.joinpath(f"task_{self.task_id}").joinpath(f"task_{self.task_id}.mp3")])
146
+ logging.info("audio extraction finished")
147
+
148
+ logging.info("Task Creation Complete.")
149
+ logging.info("Task Creation method: Youtube Link")
150
+
151
+ super().run_pipeline()
src/web/web.py ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import yaml
2
+ from flask import Flask, request, jsonify
3
+ from concurrent.futures import ThreadPoolExecutor
4
+ from src.task import Task
5
+
6
+ app = Flask(__name__)
7
+
8
+ # Global thread pool
9
+ executor = ThreadPoolExecutor(max_workers=4) # Adjust max_workers as per your requirement
10
+
11
+ @app.route('/api/task', methods=['POST'])
12
+ def create_task():
13
+ data = request.get_json()
14
+
15
+ if not data or 'youtube_link' not in data:
16
+ return jsonify({'error': 'YouTube link not provided'}), 400
17
+ youtube_link = data['youtube_link']
18
+ launch_config = yaml.load(open("./configs/local_launch.yaml"), Loader=yaml.Loader)
19
+ task = Task.fromYoutubeLink(youtube_link, 1, launch_config)
20
+
21
+ # Submit task to thread pool
22
+ executor.submit(task.run)
23
+
24
+ return jsonify({'task_id': task.task_id})
25
+
26
+
27
+ if __name__ == '__main__':
28
+ app.run(debug=True)