reelrecon 1.2.0
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.
- package/CLAUDE.md +136 -0
- package/LICENSE +21 -0
- package/README.md +335 -0
- package/bin/reelrecon.js +182 -0
- package/ig_transcriber/__init__.py +3 -0
- package/ig_transcriber/pipeline.py +1150 -0
- package/mcp_server.py +987 -0
- package/package.json +41 -0
- package/requirements.txt +6 -0
- package/transcribe_latest_reel.py +77 -0
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "reelrecon",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Reel reconnaissance for AI agents — transcribe and decode public Instagram profiles via MCP. Whisper-powered, free, runs locally.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"reelrecon": "bin/reelrecon.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"mcp_server.py",
|
|
11
|
+
"transcribe_latest_reel.py",
|
|
12
|
+
"ig_transcriber/*.py",
|
|
13
|
+
"requirements.txt",
|
|
14
|
+
"README.md",
|
|
15
|
+
"CLAUDE.md",
|
|
16
|
+
"LICENSE"
|
|
17
|
+
],
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=18"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/4nw3rprod/IG-Content-Transcriber.git"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/4nw3rprod/IG-Content-Transcriber#readme",
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"mcp-server",
|
|
29
|
+
"instagram",
|
|
30
|
+
"reels",
|
|
31
|
+
"transcription",
|
|
32
|
+
"whisper",
|
|
33
|
+
"ai-agents",
|
|
34
|
+
"content-research",
|
|
35
|
+
"competitor-analysis",
|
|
36
|
+
"claude",
|
|
37
|
+
"yt-dlp"
|
|
38
|
+
],
|
|
39
|
+
"author": "4nw3rprod",
|
|
40
|
+
"license": "MIT"
|
|
41
|
+
}
|
package/requirements.txt
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import json
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
from ig_transcriber import PipelineError, run_transcription
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def parse_args() -> argparse.Namespace:
|
|
12
|
+
parser = argparse.ArgumentParser(
|
|
13
|
+
description=(
|
|
14
|
+
"Accept an Instagram profile URL or a direct video URL, "
|
|
15
|
+
"download audio, and transcribe with Whisper."
|
|
16
|
+
)
|
|
17
|
+
)
|
|
18
|
+
parser.add_argument("input_url", help="Instagram profile URL or direct video URL")
|
|
19
|
+
parser.add_argument(
|
|
20
|
+
"--output-dir",
|
|
21
|
+
default="outputs",
|
|
22
|
+
help="Base directory for generated files. Default: %(default)s",
|
|
23
|
+
)
|
|
24
|
+
parser.add_argument(
|
|
25
|
+
"--model",
|
|
26
|
+
default="base",
|
|
27
|
+
help="Whisper model name. Examples: tiny, base, small, medium, large",
|
|
28
|
+
)
|
|
29
|
+
parser.add_argument(
|
|
30
|
+
"--language",
|
|
31
|
+
default=None,
|
|
32
|
+
help="Optional Whisper language hint, e.g. en, hi, es",
|
|
33
|
+
)
|
|
34
|
+
parser.add_argument(
|
|
35
|
+
"--json",
|
|
36
|
+
action="store_true",
|
|
37
|
+
help="Print a machine-readable JSON result to stdout",
|
|
38
|
+
)
|
|
39
|
+
return parser.parse_args()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def main() -> int:
|
|
43
|
+
args = parse_args()
|
|
44
|
+
|
|
45
|
+
try:
|
|
46
|
+
result = run_transcription(
|
|
47
|
+
args.input_url,
|
|
48
|
+
output_dir=args.output_dir,
|
|
49
|
+
model_name=args.model,
|
|
50
|
+
language=args.language,
|
|
51
|
+
reuse_existing=True,
|
|
52
|
+
)
|
|
53
|
+
except PipelineError as exc:
|
|
54
|
+
if args.json:
|
|
55
|
+
print(json.dumps({"status": "error", "error": str(exc)}, ensure_ascii=False))
|
|
56
|
+
print(f"ERROR: {exc}", file=sys.stderr)
|
|
57
|
+
return 1
|
|
58
|
+
|
|
59
|
+
if args.json:
|
|
60
|
+
print(json.dumps(result, ensure_ascii=False))
|
|
61
|
+
else:
|
|
62
|
+
print(f"Input kind: {result['input_kind']}")
|
|
63
|
+
print(f"Canonical URL: {result['canonical_url']}")
|
|
64
|
+
print(f"Videos processed: {result['completed_videos']}/{result['total_videos']}")
|
|
65
|
+
print(f"Manifest file: {result['manifest_file']}")
|
|
66
|
+
for video in result["videos"]:
|
|
67
|
+
print(f"- {video.get('title')}")
|
|
68
|
+
print(f" Video URL: {video.get('video_url')}")
|
|
69
|
+
if video.get("status") == "ok":
|
|
70
|
+
print(f" Transcript: {video.get('transcript_file')}")
|
|
71
|
+
else:
|
|
72
|
+
print(f" FAILED: {video.get('error', 'unknown error')}")
|
|
73
|
+
return 0
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if __name__ == "__main__":
|
|
77
|
+
raise SystemExit(main())
|