plexflow 0.0.64__py3-none-any.whl → 0.0.65__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,98 @@
1
+ import subprocess
2
+ from pathlib import Path
3
+ from typing import List, Optional
4
+ import re
5
+
6
+ class FFmpegError(Exception):
7
+ """Custom exception for FFmpeg errors."""
8
+ pass
9
+
10
+
11
+ def extract_audio_from_video(video_path: Path, output_dir: Path, stream_indices: Optional[List[int]] = None, sample_rate: Optional[int] = None) -> List[Path]:
12
+ """
13
+ Extracts audio streams from a video file using ffmpeg and optionally resamples the audio.
14
+
15
+ Parameters:
16
+ - video_path (Path): Path to the input video file.
17
+ - output_dir (Path): Directory where the extracted audio files will be saved.
18
+ - stream_indices (Optional[List[int]]): List of audio stream indices to extract. If None, all audio streams are extracted.
19
+ - sample_rate (Optional[int]): Desired sample rate for the extracted audio. If None, the original sample rate is used.
20
+
21
+ Returns:
22
+ - List[Path]: List of paths to the extracted audio files.
23
+
24
+ Raises:
25
+ - FileNotFoundError: If the video file does not exist.
26
+ - FFmpegError: If ffmpeg encounters an error during processing.
27
+ """
28
+ if not video_path.exists():
29
+ raise FileNotFoundError(f"The video file {video_path} does not exist.")
30
+
31
+ if not output_dir.exists():
32
+ output_dir.mkdir(parents=True, exist_ok=True)
33
+
34
+ audio_files = []
35
+
36
+ if stream_indices is None:
37
+ # Get all audio stream indices
38
+ stream_indices = get_audio_stream_indices(video_path)
39
+
40
+ for index in stream_indices:
41
+ output_file = output_dir / f'audio_stream_{index}.mp3'
42
+ command = [
43
+ 'ffmpeg', '-i', str(video_path),
44
+ '-map', f'0:a:{index-1}',
45
+ ]
46
+
47
+ if sample_rate:
48
+ command.extend(['-ar', str(sample_rate)])
49
+
50
+ command.append(str(output_file))
51
+
52
+ # Run the ffmpeg command
53
+ try:
54
+ subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
55
+ except subprocess.CalledProcessError as e:
56
+ raise FFmpegError(f"FFmpeg error: {e.stderr.decode()}")
57
+
58
+ audio_files.append(output_file)
59
+
60
+ return audio_files
61
+
62
+
63
+ def get_audio_stream_indices(video_path: Path) -> List[int]:
64
+ """
65
+ Retrieves the indices of audio streams in a video file using ffmpeg.
66
+
67
+ Parameters:
68
+ - video_path (Path): Path to the input video file.
69
+
70
+ Returns:
71
+ - List[int]: List of audio stream indices.
72
+
73
+ Raises:
74
+ - FileNotFoundError: If the video file does not exist.
75
+ - FFmpegError: If ffmpeg encounters an error during processing.
76
+ """
77
+ if not video_path.exists():
78
+ raise FileNotFoundError(f"The video file {video_path} does not exist.")
79
+
80
+ command = ['ffmpeg', '-i', str(video_path)]
81
+
82
+ try:
83
+ result = subprocess.run(command, check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
84
+ except subprocess.CalledProcessError as e:
85
+ raise FFmpegError(f"FFmpeg error: {e.stderr.decode()}")
86
+
87
+ stderr_output = result.stderr.decode()
88
+ audio_indices = []
89
+
90
+ for line in stderr_output.splitlines():
91
+ if 'Stream #' in line and 'Audio:' in line:
92
+ # Extract the stream index using a regular expression
93
+ match = re.search(r'Stream #0:(\d+)', line)
94
+ if match:
95
+ stream_index = int(match.group(1))
96
+ audio_indices.append(stream_index)
97
+
98
+ return audio_indices
@@ -1,73 +1,44 @@
1
- import subprocess
2
- import json
1
+ from typing import List
3
2
  from pydantic import BaseModel
4
- from typing import List, Optional
3
+ import subprocess
5
4
 
6
5
  class SubtitleStream(BaseModel):
7
- index: int
8
- lang: Optional[str]
9
-
10
6
  class Config:
11
- schema_extra = {
12
- "example": {
13
- "index": 0,
14
- "lang": "en"
15
- }
16
- }
17
-
18
- def get_subtitles(video_path: str) -> List[SubtitleStream]:
19
- """
20
- Function to get subtitle streams from a video file.
21
-
22
- Args:
23
- video_path (str): The path to the video file.
7
+ arbitrary_types_allowed = True
24
8
 
25
- Returns:
26
- List[SubtitleStream]: A list of SubtitleStream objects, each representing a subtitle stream.
27
-
28
- Raises:
29
- FileNotFoundError: If the video file does not exist.
30
- ValueError: If the output from the command could not be parsed.
31
-
32
- Examples:
33
- >>> video_path = "/path/to/your/video.mp4"
34
- >>> try:
35
- ... subtitles = get_subtitles(video_path)
36
- ... for subtitle in subtitles:
37
- ... print(f"Subtitle stream index: {subtitle.index}, language: {subtitle.lang}")
38
- ... except FileNotFoundError:
39
- ... print(f"The video file {video_path} does not exist.")
40
- ... except ValueError:
41
- ... print("There was a problem parsing the command output.")
42
- ...
43
- Subtitle stream index: 0, language: en
44
- Subtitle stream index: 1, language: es
45
- """
46
- if not os.path.isfile(video_path):
47
- raise FileNotFoundError(f"No such file: '{video_path}'")
9
+ index: int
10
+ language: str
48
11
 
49
- command = [
50
- 'ffprobe',
51
- '-v', 'quiet',
52
- '-print_format', 'json',
53
- '-show_streams',
54
- '-select_streams', 's',
55
- video_path
56
- ]
12
+ def __str__(self) -> str:
13
+ return f"SubtitleStream(index={self.index}, language={self.language})"
57
14
 
58
- output = subprocess.run(command, capture_output=True, text=True)
15
+ def __repr__(self) -> str:
16
+ return self.__str__()
59
17
 
60
- try:
61
- probe = json.loads(output.stdout)
62
- except json.JSONDecodeError as e:
63
- raise ValueError("Could not parse command output") from e
18
+ def get_subtitles(video_path: str) -> List[SubtitleStream]:
19
+ result = subprocess.run(
20
+ [
21
+ "ffmpeg",
22
+ "-i", video_path,
23
+ ],
24
+ stderr=subprocess.PIPE,
25
+ stdout=subprocess.PIPE,
26
+ )
27
+ output = result.stderr.decode("utf-8")
64
28
 
65
29
  subtitle_streams = []
66
- for stream in probe['streams']:
67
- subtitle_info = SubtitleStream(
68
- index=stream['index'],
69
- lang=stream['tags']['language'] if 'tags' in stream and 'language' in stream['tags'] else None
70
- )
71
- subtitle_streams.append(subtitle_info)
30
+ for line in output.splitlines():
31
+ if "Stream #" in line and "Subtitle" in line:
32
+ index = int(line.split("#")[1].split(":")[0].strip())
33
+ language = line.split("(")[1].split(")")[0].strip()
34
+ subtitle_streams.append(SubtitleStream(index=index, language=language))
72
35
 
73
36
  return subtitle_streams
37
+
38
+ def count_subtitles(video_path: str) -> int:
39
+ subtitles = get_subtitles(video_path)
40
+ return len(subtitles)
41
+
42
+ def has_dutch_subtitles(video_path: str) -> bool:
43
+ subtitles = get_subtitles(video_path)
44
+ return any(subtitle.language.lower() == "nl" for subtitle in subtitles)
@@ -1,17 +1,18 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: plexflow
3
- Version: 0.0.64
3
+ Version: 0.0.65
4
4
  Summary: A short description of the package.
5
5
  Home-page: https://www.example.com
6
6
  License: MIT
7
7
  Keywords: keyword1,keyword2,keyword3
8
8
  Author: Your Name
9
9
  Author-email: you@example.com
10
- Requires-Python: ==3.12.4
10
+ Requires-Python: >=3.12,<3.13
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: MIT License
14
14
  Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.12
15
16
  Classifier: Programming Language :: Python :: 3.10
16
17
  Requires-Dist: apache-airflow (>=2.9.3,<3.0.0)
17
18
  Requires-Dist: apache-airflow-providers-cncf-kubernetes (>=8.3.3,<9.0.0)
@@ -42,7 +43,8 @@ Requires-Dist: langchain-google-genai (>=1.0.8,<2.0.0)
42
43
  Requires-Dist: langchain-groq (>=0.1.9,<0.2.0)
43
44
  Requires-Dist: langcodes (>=3.4.0,<4.0.0)
44
45
  Requires-Dist: lxml (>=5.1.0,<6.0.0)
45
- Requires-Dist: numpy (>=2.0.1,<3.0.0)
46
+ Requires-Dist: mistralai (>=1.2.5,<2.0.0)
47
+ Requires-Dist: numpy (==2.0)
46
48
  Requires-Dist: parse-torrent-title (>=2.8.1,<3.0.0)
47
49
  Requires-Dist: playwright (>=1.41.2,<2.0.0)
48
50
  Requires-Dist: playwright-stealth (>=1.0.6,<2.0.0)
@@ -147,10 +147,10 @@ plexflow/core/torrents/analyzers/torrentquest/analyzer.py,sha256=f2X3CcYBA9xYZ6k
147
147
  plexflow/core/torrents/auto/auto_providers/auto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
148
  plexflow/core/torrents/auto/auto_providers/auto/torrent.py,sha256=yenzXr-VqmpoEONJdMOKgtstdOSzCIAFphTTm8ZI7B4,1594
149
149
  plexflow/core/torrents/auto/auto_providers/tpb/torrent.py,sha256=8X2i75s3sI9rGcTQ94_0kNkO-7docR9P_I0BRAv7PUQ,1612
150
- plexflow/core/torrents/auto/auto_torrents.py,sha256=FvLXSoMvytLjPRwXi1P9FnEerqtniVTb-VJODZ4UdnI,1411
150
+ plexflow/core/torrents/auto/auto_torrents.py,sha256=bAdHIm120yU-2hyF-3UE-DTANr2nxSgcjfGIU99uzGw,1521
151
151
  plexflow/core/torrents/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
152
152
  plexflow/core/torrents/providers/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
- plexflow/core/torrents/providers/ext/ext.py,sha256=Q7K8g2Dwq9-uWXukfSpixcbw55dUyeyBJboMRRV9BYs,783
153
+ plexflow/core/torrents/providers/ext/ext.py,sha256=P_cg14aRlX4MyMZnI4j8bxFH4JnNkow0-wO2Ye9a9-s,759
154
154
  plexflow/core/torrents/providers/ext/utils.py,sha256=5luyin-_yCSxMtlx1W0DAKZaCAyKnBdvfpRmKojvTI4,1445
155
155
  plexflow/core/torrents/providers/extratorrent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
156
  plexflow/core/torrents/providers/extratorrent/extratorrent.py,sha256=eKfomcjs41jxQfttX7Qwd6b-wmpZ3S4rCcsU_sewtDo,895
@@ -170,17 +170,17 @@ plexflow/core/torrents/providers/tgx/dump.py,sha256=F9VdUyTT4BnQ7V-ESTAg7rWD4iPo
170
170
  plexflow/core/torrents/providers/tgx/tgx.py,sha256=nt5dIcCrDsF91zds1KOwbCDqyYseuYismyDjhtrMT3k,881
171
171
  plexflow/core/torrents/providers/tgx/utils.py,sha256=gUSgKDRcQvCZie2wo6ADYecs_ltHxqhMTAY3mlMmDGE,1813
172
172
  plexflow/core/torrents/providers/therarbg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
- plexflow/core/torrents/providers/therarbg/therarbg.py,sha256=dQ5Y-1XIlgEpvYaxZ34i19LXb-DFbtVNPkoEuBj3jAY,743
173
+ plexflow/core/torrents/providers/therarbg/therarbg.py,sha256=rKeyFKJhGYJQdXLVGMg_fat6WjTsS7n-rPf7-84_lnE,796
174
174
  plexflow/core/torrents/providers/therarbg/utils.py,sha256=sEP4dcJNuE5pxu2Gf8rrnxW06dxz4ZOGeJMe1mY1PBA,1465
175
175
  plexflow/core/torrents/providers/torrentquest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
176
  plexflow/core/torrents/providers/torrentquest/torrentquest.py,sha256=VxKDfVo9ArkeVuvyWnMR0kCe7REA4SgvLjsZvVN7dNg,925
177
177
  plexflow/core/torrents/providers/torrentquest/utils.py,sha256=RZoJFZpyI-vRDRX-T7tnbeGyb5jdk4UdHyhEgLuwRLM,1664
178
178
  plexflow/core/torrents/providers/tpb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- plexflow/core/torrents/providers/tpb/tpb.py,sha256=H_ygdyFFDPOWzvKoV01DSY9cBqRE8e3-wO0tmbuJKqo,534
179
+ plexflow/core/torrents/providers/tpb/tpb.py,sha256=YB-a3kZ4DUzXkI4TJJszVvoJiX4L0QUJuCo-9iqC6JQ,681
180
180
  plexflow/core/torrents/providers/tpb/utils.py,sha256=xZEU9tbRnG8nR2lspPenIA0UqmqxMIH_uv1sMtW79qM,3621
181
181
  plexflow/core/torrents/providers/yts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
182
  plexflow/core/torrents/providers/yts/utils.py,sha256=SYV7yohab-gF5Nj67fO8Lkus84-h0OBD3BkIY6U6A1I,1699
183
- plexflow/core/torrents/providers/yts/yts.py,sha256=5QgZZs0AKWEI6bjwVHs2pyLtSf2cYOw6cB5FTUqyRU8,1048
183
+ plexflow/core/torrents/providers/yts/yts.py,sha256=GkoTzrf70Fn62N56aCcWErTWKSdJTesATmPr_kmUNI4,1361
184
184
  plexflow/core/torrents/results/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
185
185
  plexflow/core/torrents/results/torrent.py,sha256=xsFFOG8Wh5YslQ4d5lhrhi2I5LHGBTCdC30CU06GAKs,4770
186
186
  plexflow/core/torrents/results/universal.py,sha256=eU0GyxewT9XkvFbtUIaNNB-Y_aXCl7XPvb5z8VVyE1o,6614
@@ -201,12 +201,14 @@ plexflow/spiders/tgx/pipelines/validation_pipeline.py,sha256=wxT8JzQswpfq3wKIaDk
201
201
  plexflow/spiders/tgx/settings.py,sha256=A4bzof5TDLkMF6P_37otNY5e3b0Bwqia2vGmLwVO4cA,1180
202
202
  plexflow/spiders/tgx/spider.py,sha256=fBDksNThRm9bWjvEKeora6eiUKkxQBdISBaYOXIvjgM,2421
203
203
  plexflow/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
- plexflow/utils/antibot/human_like_requests.py,sha256=UIEL_fJrYct8hrhLkSzGD7v9ZPIGZtgi8l6aAdfAk2g,5843
204
+ plexflow/utils/antibot/human_like_requests.py,sha256=-UKo2LgJtgp7CYggxPsUT74vfXyYosdbg5f-DzaEgQU,6116
205
205
  plexflow/utils/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
- plexflow/utils/api/context/http.py,sha256=18JEz4g4N6GkND-YWNDVTMdAd6P5sBZ8wxfqdW61hzM,2975
206
+ plexflow/utils/api/context/http.py,sha256=TRpEe9_QUEfkVZIMqcAtDJ7Lu5Xl53KyiwBiTHVpbms,4120
207
207
  plexflow/utils/api/rest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
208
  plexflow/utils/api/rest/antibot_restful.py,sha256=7sxaNsx5jAehyBg1qYfLg45Q_AyijsG8X48_y5oI5Yk,2749
209
+ plexflow/utils/api/rest/plexful.py,sha256=H9_hm08zpBajLE46E7OJGdTUwWJvFivFbYpzm2U5cVQ,3202
209
210
  plexflow/utils/api/rest/restful.py,sha256=vk7TjRuvXcs4c3MgjU38IPDhVy9GQ2y-WZyJAvEbT88,2405
211
+ plexflow/utils/api/rest/url_builder.py,sha256=be1iUP-m3t4wT0JdyU5Z_4l_-aHP5NgSl6imFloRavM,331
210
212
  plexflow/utils/captcha/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
213
  plexflow/utils/captcha/bypass/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
212
214
  plexflow/utils/captcha/bypass/decode_audio.py,sha256=yP8vZiIbnCR-wD2Ex3cDyCatj_fXGJTv5IQHPpM70hI,1327
@@ -223,34 +225,37 @@ plexflow/utils/hooks/redis.py,sha256=ZvrSgM7s-OgRLIb8uV8rm6XjF40rLkoPOPABEmuKdNk
223
225
  plexflow/utils/image/storage.py,sha256=RlV7D0aGqoG583xP8YCC7TK5YmW8rFff2NwvtOzy5DE,1168
224
226
  plexflow/utils/imdb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
225
227
  plexflow/utils/imdb/imdb_codes.py,sha256=aIECE9IEFSYbY3A-erONQiFUqy36JrH2hhcM3qWObk0,3028
228
+ plexflow/utils/llm/mistral.py,sha256=OX_ogd7i3xzh7959O65oGzzfhuGRTFWsUwwmkShH7fs,4521
226
229
  plexflow/utils/pubsub/consume.py,sha256=hgp-W2GzFzcO-OAaQFxk5zTljpoWqreRTAowQxljO_k,3130
227
- plexflow/utils/pubsub/produce.py,sha256=id0KGg47V4ubQ16a-gDSDb9ICy86NfO0BcUbBPgf8As,1068
230
+ plexflow/utils/pubsub/produce.py,sha256=hR8f4ZBZMUcxw1WHiv_9Pdel0N2WO2tamZ70PGFOk84,1682
228
231
  plexflow/utils/retry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
229
232
  plexflow/utils/retry/utils.py,sha256=wqdtkxSBT9dYVgWGKSYxuEiZHBVmfOjzVxXDOweVuoo,1784
230
233
  plexflow/utils/strings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
234
  plexflow/utils/strings/filesize.py,sha256=mLVd0xqIEzAif5Tn_PyCddFmUPXPNnEbLhBNJTsgOvs,1547
235
+ plexflow/utils/strings/json_extract.py,sha256=590oY1LMnbe9COm3fD6z74OtOzxeXd3Hrf06afhHOvc,14884
232
236
  plexflow/utils/strings/language.py,sha256=J9-wqmCdxf9Ws5_X1tV4vX4d7AGkKci0eaBE4Lit0j0,269
233
- plexflow/utils/subtitle/search.py,sha256=wnEg6cLJDulxVPg7kkAoJLsm2o0wRy3OLYp5t73yaSE,2432
237
+ plexflow/utils/subtitle/search.py,sha256=MbLJFeU9LDdFnXZXAI86YroBfD4X4Jp0YynLsnEvQ-c,2433
234
238
  plexflow/utils/tasks/decorators.py,sha256=1pF3bVFO2YCJd2gFNVYdmaQpbV3nRP1RxJ_OhLU-g7E,3051
235
239
  plexflow/utils/tasks/k8s/task.py,sha256=oCfOBjitZ48D1M52w2dpf7HaHZTmvYV9YS_ccixLs0w,2709
236
240
  plexflow/utils/thread_safe/safe_list.py,sha256=BScIH27Gh84Nb7SZxmfeZ9vF2hh75yCml266fN6UHLI,1261
237
241
  plexflow/utils/thread_safe/safe_set.py,sha256=wTlR3RK6QShRFdij1-HOT2YUAtONivySQ1wfWRL-7pU,1844
238
242
  plexflow/utils/torrent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
239
243
  plexflow/utils/torrent/analyze.py,sha256=Wt8NqbgocnLz0arKxqC1qQmvGh6XUbh2fe-lHLYSjjc,4496
240
- plexflow/utils/torrent/extract/common.py,sha256=464KG9-8SXL48Yy8rH-7q1E0qdxjw6vFqW6JktAG6H0,1215
244
+ plexflow/utils/torrent/extract/common.py,sha256=DtEe7aUfE96pwWnVl0aUOlRBq2ps36tEfealFZp70hg,1216
241
245
  plexflow/utils/torrent/extract/ext.py,sha256=3jmBfR1zL8XgdhR1BVZWRmH7TN68gFcX5K799bjwN0o,271641
242
246
  plexflow/utils/torrent/extract/extratorrent.py,sha256=G_PlvT1CcMiq96q3BMsSwMg-BEjD3kp0IBB6up8zoK4,2339
243
247
  plexflow/utils/torrent/extract/kat.py,sha256=-pQND_1forno9wn5w-Kua7PJFjKpDH_HcYvMIOJ8kA0,91269
244
248
  plexflow/utils/torrent/extract/tgx.py,sha256=EMvuK5LcuukTaDgTsSU-9fP4vYDU931957JnyLnhCcY,3223
245
249
  plexflow/utils/torrent/extract/therarbg.py,sha256=q97dJCmpnzKJcrhlOwOWx-ovMCk5qVY1HCXa4RAvrao,6527
246
250
  plexflow/utils/torrent/extract/torrentquest.py,sha256=gQn9GanFM5SXvpwjcyRu0XgTZ23KTJ_FeHIsanGl2WI,6868
247
- plexflow/utils/torrent/files.py,sha256=6b2Th2hB75etZfupfyjlSjQHcFfLSYUlFPkHaH50W4o,952
248
- plexflow/utils/torrent/hash.py,sha256=TDAcTFatdwtYR9yN6PWI2uS5tzyFEldS9N5c-T56We8,2958
251
+ plexflow/utils/torrent/files.py,sha256=XJxvFedZQb8H-wSzNIZI_2nUOT-pqr6MwgYcoty0yA0,2285
252
+ plexflow/utils/torrent/hash.py,sha256=yaVAXj6t4qouNVUdZ-ulgrhTSLsp7DOggyB6sanCPX8,3162
249
253
  plexflow/utils/transcribe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
250
- plexflow/utils/transcribe/speech2text.py,sha256=DUhLS3DkHy047eTUHUoR_5TPOxSjyg5y1Iofpt0Iu18,1060
254
+ plexflow/utils/transcribe/speech2text.py,sha256=DED9lpu1Aa8GJ0UmlWSPq7UbTGZSSp8lbIEqvwpwhV8,3543
251
255
  plexflow/utils/video/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
252
- plexflow/utils/video/subtitle.py,sha256=15-XZJ55JeLMxiaR1IbSrMkps0PTbSZVS4AklgUdUU8,2207
253
- plexflow-0.0.64.dist-info/METADATA,sha256=vMdUrfXHY9YTqLF1T19OG2X4gVnKB7ke0iGQD2j8BRU,3070
254
- plexflow-0.0.64.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
255
- plexflow-0.0.64.dist-info/entry_points.txt,sha256=REGVJzZ5cY7JzCEHJnK7rNXOWmmYQIMU2W91CklPczQ,1162
256
- plexflow-0.0.64.dist-info/RECORD,,
256
+ plexflow/utils/video/audio.py,sha256=tJ_lNwcjVuBQYD5cYOlXpr__eh8-hnReIgNRgIYOpqo,3380
257
+ plexflow/utils/video/subtitle.py,sha256=LOGONGxs_RzmqtGP-DBKreOzS1eUFEKo75Q6AfnavW0,1290
258
+ plexflow-0.0.65.dist-info/METADATA,sha256=_Tc3X9YgpgI5DpYHixKp4eJHp7gO-dGQ9eLdkr5Ynq8,3158
259
+ plexflow-0.0.65.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
260
+ plexflow-0.0.65.dist-info/entry_points.txt,sha256=A-_w_iUmjrSgDtOcX-G5H3NboAAZNzwiFoQbBf4bVjg,1302
261
+ plexflow-0.0.65.dist-info/RECORD,,
@@ -1,4 +1,5 @@
1
1
  [console_scripts]
2
+ audio_extract=scripts.video.audio_extract:main
2
3
  auto_torrents=scripts.torrents.auto_torrents:main
3
4
  chat_with_plexa=scripts.plex.discover.chat_with_plexa:main
4
5
  download_subtitles=scripts.subtitles.download_subtitles:main
@@ -6,8 +7,10 @@ find_torrents=scripts.torrents.find_torrents:main
6
7
  gemini_ai=scripts.gemini.gemini_ai:main
7
8
  get_movie=scripts.metadata.auto.get_movie:main
8
9
  get_show=scripts.metadata.auto.get_show:main
10
+ groq_transcribe=scripts.transcribe.groq_transcribe:main
9
11
  human_like=scripts.antibot.human_like:main
10
12
  match_torrent_imdb=scripts.torrents.match_torrent_imdb:main
13
+ mistral=scripts.mistral.mistral:main
11
14
  on_download_completed=scripts.torrents.on_download_completed:main
12
15
  parse_movie_torrent=scripts.torrents.parse_movie_torrent:main
13
16
  plex_activity_feed=scripts.plex.discover.get_activity_feed:main