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.
- plexflow/core/torrents/auto/auto_torrents.py +4 -4
- plexflow/core/torrents/providers/ext/ext.py +1 -1
- plexflow/core/torrents/providers/therarbg/therarbg.py +4 -4
- plexflow/core/torrents/providers/tpb/tpb.py +10 -8
- plexflow/core/torrents/providers/yts/yts.py +14 -7
- plexflow/utils/antibot/human_like_requests.py +10 -0
- plexflow/utils/api/context/http.py +32 -5
- plexflow/utils/api/rest/plexful.py +64 -0
- plexflow/utils/api/rest/url_builder.py +9 -0
- plexflow/utils/llm/mistral.py +139 -0
- plexflow/utils/pubsub/produce.py +22 -1
- plexflow/utils/strings/json_extract.py +434 -0
- plexflow/utils/subtitle/search.py +1 -0
- plexflow/utils/torrent/extract/common.py +1 -0
- plexflow/utils/torrent/files.py +49 -5
- plexflow/utils/torrent/hash.py +7 -1
- plexflow/utils/transcribe/speech2text.py +83 -17
- plexflow/utils/video/audio.py +98 -0
- plexflow/utils/video/subtitle.py +32 -61
- {plexflow-0.0.64.dist-info → plexflow-0.0.65.dist-info}/METADATA +5 -3
- {plexflow-0.0.64.dist-info → plexflow-0.0.65.dist-info}/RECORD +23 -18
- {plexflow-0.0.64.dist-info → plexflow-0.0.65.dist-info}/entry_points.txt +3 -0
- {plexflow-0.0.64.dist-info → plexflow-0.0.65.dist-info}/WHEEL +0 -0
@@ -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
|
plexflow/utils/video/subtitle.py
CHANGED
@@ -1,73 +1,44 @@
|
|
1
|
-
import
|
2
|
-
import json
|
1
|
+
from typing import List
|
3
2
|
from pydantic import BaseModel
|
4
|
-
|
3
|
+
import subprocess
|
5
4
|
|
6
5
|
class SubtitleStream(BaseModel):
|
7
|
-
index: int
|
8
|
-
lang: Optional[str]
|
9
|
-
|
10
6
|
class Config:
|
11
|
-
|
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
|
-
|
26
|
-
|
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
|
-
|
50
|
-
|
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
|
-
|
15
|
+
def __repr__(self) -> str:
|
16
|
+
return self.__str__()
|
59
17
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
67
|
-
|
68
|
-
index=
|
69
|
-
|
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.
|
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:
|
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:
|
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=
|
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=
|
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=
|
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=
|
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=
|
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
|
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=
|
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=
|
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=
|
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=
|
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=
|
248
|
-
plexflow/utils/torrent/hash.py,sha256=
|
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=
|
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/
|
253
|
-
plexflow
|
254
|
-
plexflow-0.0.
|
255
|
-
plexflow-0.0.
|
256
|
-
plexflow-0.0.
|
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
|
File without changes
|