1  �
   2  
   3  Gs�j�A����SrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	J	r	 Sr
   4  \RRS5(aSO4\RR\RR\5S5r\RR\S5rSrS	rS
   5  r/SQrSr/S
   6  QrSrSSjrSSjrSrSrSSjrSSjrSSjrSr S Sjr!Sr"Sr#\$S:Xa\#"5 gg)!a#
   7  NeuralOS Magnet Vault & Tor Crawler
   8  Queries torrent indexers and Stremio streaming providers over Tor SOCKS5h (127.0.0.1:9050).
   9  Integrates Cinemeta metadata resolver, Torrentio multi-network aggregator, TorrentsDB,
  10  YTS REST API, and PirateBay mirrors into a high-speed SQLite Magnet Vault.
  11  �N)�datetimez127.0.0.1:9050z/var/neural_memory/data�dataz
  12  magnets.dbzBhttps://v3-cinemeta.strem.io/catalog/movie/top/search={query}.jsonz7https://torrentio.strem.fun/stream/movie/{imdb_id}.jsonz2https://torrentsdb.com/stream/movie/{imdb_id}.json)z3https://movies-api.accel.li/api/v2/list_movies.jsonz&https://yts.lt/api/v2/list_movies.jsonz&https://yts.mx/api/v2/list_movies.jsonz(https://tpb.party/search/{query}/1/7/200)z*udp://tracker.opentrackr.org:1337/announcez$udp://open.demonii.com:1337/announcez#udp://tracker.openbittorrent.com:80z"udp://tracker.coppersurfer.tk:6969z"udp://glotorrents.pw:6969/announcez&udp://torrent.gresille.org:80/announcezudp://p4p.arenabg.com:1337c�R�[R"[SS9 [R"[
  13  5nUR
  14  5nURS5 URS5 URS5 URS5 UR5 UR5 g)NT)�exist_oka
  15      CREATE TABLE IF NOT EXISTS magnets (
  16          id INTEGER PRIMARY KEY AUTOINCREMENT,
  17          info_hash TEXT UNIQUE,
  18          title TEXT NOT NULL,
  19          category TEXT DEFAULT 'movie',
  20          year INTEGER,
  21          quality TEXT,
  22          size_str TEXT,
  23          size_bytes INTEGER DEFAULT 0,
  24          seeders INTEGER DEFAULT 0,
  25          leechers INTEGER DEFAULT 0,
  26          magnet_uri TEXT NOT NULL,
  27          source TEXT,
  28          imdb_id TEXT,
  29          poster_url TEXT,
  30          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  31      );
  32      z?CREATE INDEX IF NOT EXISTS idx_magnets_title ON magnets(title);zBCREATE INDEX IF NOT EXISTS idx_magnets_hash ON magnets(info_hash);z@CREATE INDEX IF NOT EXISTS idx_magnets_imdb ON magnets(imdb_id);)
  33  �os�makedirs�DB_DIR�sqlite3�connect�DB_PATH�cursor�execute�commit�close)�conn�cs  �,/Users/shubhamsharma/project/magnet_vault.py�init_dbr,su���K�K���&��?�?�7�#�D����
  34  �A��I�I��	�&�I�I�O�P��I�I�R�S��I�I�P�Q��K�K�M��J�J�L�c
  35  � �SS[SSS[U5SSU/
  36  n[R"U[R[RSUS	-S
  37  9nUR
  38  S:XaUR(aUR$g![a gf=f)
  39  z<Executes a GET request through Tor SOCKS5h proxy using curl.�curlz--socks5-hostname�-s�-L�
  40  --max-time�-AzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36T���stdout�stderr�text�timeoutrN)�	TOR_SOCKS�str�
  41  subprocess�run�PIPE�
  42  returncoder�	Exception��urlr!�cmd�ress    r�	tor_fetchr-Is���	��Y����c�'�l�����C�
  43  ��n�n�S�������W[�el�op�ep�q���>�>�Q��3�:�:��:�:�����
  44  ���
  45  �s�A#B�
  46  B
  47  �B
  48  c��SSSS[U5SSU/n[R"U[R[RSUS-S	9nURS
  49  :XaUR
  50  (aUR
  51  $g![a gf=f)z7Fetches non-censored metadata directly (e.g. Cinemeta).rrrrrzMozilla/5.0TrrrN)r#r$r%r&r'rr(r)s    r�direct_fetchr/\s���	����c�'�l��m��
  52  �C�
  53  ��n�n�S�������W[�el�op�ep�q���>�>�Q��3�:�:��:�:�����
  54  ���
  55  �s�A#A:�:
  56  B�Bc	���SR[Vs/sH%nS[RR	U53PM' sn5n[RR	U5nSUSUSU3$s snf)N�&ztr=zmagnet:?xt=urn:btih:z&dn=)�join�TRACKERS�urllib�parse�quote)�	info_hash�display_name�t�	tr_params�dns     r�build_magnetr<nsi������J��A�C���� 2� 2�1� 5�6�7��J�K�I�	���	�	�L�	)�B�
  57  !�)��D���A�i�[�A�A��Ks�,A1c�^�[RRU5n[R	US9n[U5=(d [
  58  U5nU(dg[R"U5nURS/5nU(a�USnURS5=(d URS5nU(a[[U5SS5OSnURS5URS	5UURS
  59  5S.$g![a SnNDf=f![a gf=f)zOResolves fuzzy movie title to exact IMDb ID and official poster using Cinemeta.��queryN�metasr�releaseInfo�year��id�name�poster)�imdb_id�titlerB�
  60  poster_url)
  61  r4r5r6�CINEMETA_SEARCH�formatr/r-�json�loads�get�intr#r()	r?�enc_q�target�payloadrr@�m�year_val�year_ints	         r�resolve_cinemetarVss���L�L���u�%�E�
  62  �
  63  #�
  64  #�%�
  65  #�
  66  0�F��6�"�7�i��&7�G���
  67  ��z�z�'�"������"�%����a��A��u�u�]�+�<�q�u�u�V�}�H�
  68   �5=�3�s�8�}�R�a�0�1�4���5�5��;����v�� ��e�e�H�o�	�
  69  �����
  70   ���
  71   ���
  72  ���
  73  �s7�AD�7 D
  74  �3D�
  75  D�D�D�D�
  76  D,�+D,c���/n[RUS9n[USS9nU(dU$[R"U5nURS/5n	U	SUGH�n
  77  U
  78  RSS5R
  79  5nU(dM-U
  80  RSS5nU
  81  RS	S5n
  82  US
  83  -U
  84  -R5nSU;dSU;aSnOS
  85  U;aS
  86  nOSU;aSnOSnSnSn[R"SU
  87  5nU(a[URS55n[R"SU
  88  [R5nU(aURS5nSn[R"SU
  89  5nU(aURS5R5nU(aUSUSUS3OUSUS3n[UU5nURUUSUUUSUSUUUUS.
  90  5 GM� U$![a U$f=f)z3Fetches streams from Torrentio aggregator over Tor.)rG��r!�streamsN�infoHash�rErH� �4k�2160p�1080p�720p�HDRip�
  91  �Torrentu👤\s*(\d+)�u💾\s*([\d\.]+\s*(?:GB|MB))�	torrentiou⚙️\s*([a-zA-Z0-9_-]+)� (�) [�]� [�movier�
  92  r7rH�categoryrB�quality�size_str�
  93  size_bytes�seeders�leechers�
  94  magnet_uri�sourcerGrI)�TORRENTIO_STREAMrKr-rLrMrN�upper�lower�re�searchrO�group�
  95  IGNORECASEr<�appendr()rGrHrBrI�limit�resultsrQrRrrZ�sr7�	name_line�
  96  title_line�comb�qual�seedsro�seeds_match�
  97  size_matchrt�	src_match�	full_name�mags                        r�search_torrentior��s	���G�
  98  �
  99  $�
 100  $�W�
 101  $�
 102  5�F����+�G����8
 103  ��z�z�'�"���(�(�9�b�)����%��A����j�"�-�3�3�5�I������f�b�)�I����w��+�J���O�j�0�7�7�9�D��t�|�w�$�����D�����4�������E� �H��)�)�O�Z�@�K���K�-�-�a�0�1�����#B�J�PR�P]�P]�^�J��%�+�+�A�.�� �F��	�	�">�
 104  �K�I��"����+�1�1�3��8<�5�'��D�6��T�F�!�4�U�G�2�d�V�ST�BU�I��y�)�4�C��N�N�&��#���$�� ��!� �"�(��
 105  �K!�l�N���
 106  ���N�
 107  �s�F:G&�&
 108  G4�3G4c�
 109  �/n[RRU5n[GH�nUSUSU3n[	USS9nU(dM![
 110  R"U5nURS5S:XGavURS05RS5(GaLUSSGH2nURS	5n	URS
 111  5n
 112  URS5nURS5=(d URS
 113  5nURS/5H�n
 114  U
 115  RSS5R5nU(dM,U
 116  RSS5nU
 117  RSS5nU
 118  RSS5nU
 119  RSS5nU
 120  RSS5nU	SU
 121  SUS3n[UU5nURUU	SU
 122  UUUUUUSUUS.
 123  5 M� GM5 U(a U$GM�GM�GM� U$![a GM�f=f)Nz?query_term=z#&sort_by=seeds&order_by=desc&limit=rXrY�status�okr�moviesrHrB�	imdb_code�large_cover_image�medium_cover_image�torrents�hashr\rnr`�sizerprr��peersrgrhrirk�ytsrl)r4r5r6�YTS_API_ENDPOINTSr-rLrMrNrvr<r|r()r?r}r~rP�base_url�
 124  target_urlrRrrSrHrBrGrFr9r7rnrorpr�r�r�r�s                      r�search_movies_ytsr��s���G��L�L���u�%�E�%�%�� �z��e�W�4W�X]�W^�_�
 125  ��J��3����&	��:�:�g�&�D��x�x��!�T�)�d�h�h�v�r�.B�.F�.F�x�.P�.P��f��h�/�A��E�E�'�N�E��5�5��=�D��e�e�K�0�G��U�U�#6�7�V�1�5�5�AU�;V�F��U�U�:�r�2��$%�E�E�&�"�$5�$;�$;�$=�	�(�$�"#�%�%�	�7�";��#$�5�5���#4��%&�U�U�<��%;�
 126  � !���g�q� 1�� !���g�q� 1��',�g�R��v�S��	��$C�	�*�9�i�@�����)2�%*�(/�$(�'.�(0�*4�',�(-�*-�&+�'.�*0�(��3�0�@���N�	�C/Q�)�&�X�N���	��	�s�
 127  FG3�3
 128  H�Hc�p�/n[RRU5n[R	US9n[USS9nU(dU$Sn[R"Xe[R5nUSUH�up�n
 129  U	R5n	[RRU
 130  5nSUR5;aSOSUR5;aSOSnSUR5;dS	UR5;aSnURS
 131  S5n
 132  URU	USSUS
 133  SSSU
 134  SSSS.
 135  5 M� U$)Nr>�rYzDhref="(magnet:\?xt=urn:btih:([A-Fa-f0-9]{40})&amp;dn=([^"&]+)[^"]*)"r`ra�480pr_r^z&amp;r1�seriesrdrrc��thepiratebayrl)r4r5r6�TPB_SEARCH_URLrKr-rx�findallr{rv�unquote_plusrw�replacer|)r?r}r~rPr��	html_data�pattern�matches�full_mag_escapedr7�raw_dnr;rn�full_mags              r�search_series_tpbr�s&���G��L�L���u�%�E��&�&�U�&�3�J��*�b�1�I����U�G��j�j��R�]�]�;�G�/6�v���+��V��O�O�%�	�
 136  �\�\�
 137  &�
 138  &�v�
 139  .��$����
 140  �2�'�6�R�X�X�Z�CW��]c���b�h�h�j� �D�B�H�H�J�$6��G�#�+�+�G�S�9�����"�� ���!����"�$���
 141  �	�0?�2�Nrc�~�[5 [R"[5nUR	5nSnUHOnURSUSUSUSUSUSUSUS	US
 142  USUSUS
 143  USUS4
 144  5 US-
 145  nMQ UR5 UR5 U$![a M�f=f)NraU
 146              INSERT INTO magnets (info_hash, title, category, year, quality, size_str, size_bytes, seeders, leechers, magnet_uri, source, imdb_id, poster_url)
 147              VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
 148              ON CONFLICT(info_hash) DO UPDATE SET
 149                  seeders=excluded.seeders,
 150                  leechers=excluded.leechers,
 151                  quality=excluded.quality,
 152                  size_str=excluded.size_str,
 153                  poster_url=COALESCE(excluded.poster_url, magnets.poster_url),
 154                  imdb_id=COALESCE(excluded.imdb_id, magnets.imdb_id)
 155              r7rHrmrBrnrorprqrrrsrtrGrIre)	rr
 156  rrr
 157  rr(rr)�itemsrr�saved�its     r�
 158  save_to_vaultr�)s����I��?�?�7�#�D����
 159  �A�
 160  �E���	�
 161  �I�I�
 162  ��;���G��b��n�b��j�"�Y�-��:���<� 0�"�Y�-��J���<� �"�X�,��9�
 163  �r�,�?O��
 164  �
 165  �Q�J�E�#�(	�K�K�M��J�J�L��L��	�	��	�s�AB.�.
 166  B<�;B<c���[5 [R"[5nUR	5nURSU45 UR
 167  5nUR5 U$)NzwSELECT id, title, year, quality, size_str, seeders, info_hash, source, created_at FROM magnets ORDER BY id DESC LIMIT ?)rr
 168  rrr
 169  r�fetchallr)r}rr�rowss    r�
 170  list_vaultr�FsZ���I��?�?�7�#�D����
 171  �A��I�I�H�KP�JR�S��:�:�<�D��J�J�L��Krc��U(d[S5 g[S5 [SSSSSSSS	SS
 172  SSSS
 173  SS35 [S5 [U5HwupURS5(aUSSUSS3OUSn[U5S:�aUSSS-OUn[US-SSUSSSUSS	SUSSSUSS
 174  SU35 My [S5 g)Nz%[!] No releases found matching query.�d====================================================================================================�#z<3� | �Quality�<7�Seedsz<6�Size�<10�Source�<12�Title�d----------------------------------------------------------------------------------------------------rBrHrg�)�2�..rernrqrort)�print�	enumeraterN�len)r��ir��
 175  title_disp�title_shorts     r�print_tabler�Os���
 176  �5�6��	�)��	�S��H�C�	�"�~�S����C��s�|�3�x�PS�n�TW�X_�W`�
 177  a�b�	�)���5�!���8:���v����7��}�B�r�&�z�l�!�4�B�w�K�
 178  �25�j�/�B�2F�z�#�2���-�J��
 179  ��1��R���B�y�M�"�-�S��I��r�0B�#�b��n�UX�EY�Y\�]_�`h�]i�jm�\n�nq�r}�q~��	A�"�
 180  �)�rc�
 181  �[[R5S:a![S5 [R"S5 [RSR5nUS:XGa�[[R5S:a![S5 [R"S5 SR
 182  [RSS5n[SUS	35 /n[U5nU(akURS
 183  5(aUUS
 184  nUSnUSnUS
 185  n[SUSUSUS35 [SUS35 [XEXg5nURU5 [U5S:a+[SUS	35 [U5n	URU	5 [U5S:a+[SUS	35 [U5n
 186  URU
 187  5 [U5 U(a-[U5n[SUS[S35 [S5 ggUS:Xa�[[R5S:�a[![RS5OSn[#U5n
 188  U
 189  (d[S5 g[S5 [SS S!S"S#S!S$S%S!S&S'S!S(S)S!S*35 [S+5 U
 190  HYnUu	p�nnnnnnnU(aUSUS,3OUn[U5S-:�aUSS-S.-OUn[US S!US#S!US%S!US'S!US)S!U35 M[ [S5 gUS/:XGah[[R5S:a![S05 [R"S5 [RSR%5n['5 [(R*"[5nUR-5nUR/5(aUR1S1[!U545 O!UR1S2UR3545 UR55nUR75 U(d%[S3US435 [R"S5 Uup�nnn[S5US6US35 [S7U35 [S8U35 gUS9:Xax['5 [(R*"[5nUR-5nUR1S:5 UR55S;nUR75 [S<US=35 g[S>US?35 g)@Nraa
 191  NeuralOS Magnet Vault CLI
 192  Usage:
 193    magnet_vault.py search "<movie or series title>"   Search over Tor and save to vault
 194    magnet_vault.py list                               List indexed items in vault
 195    magnet_vault.py get <id or info_hash>              Get full magnet URI
 196    magnet_vault.py count                              Display vault statistics
 197  rery�z'Usage: magnet_vault.py search "<query>"r]z[*] Querying Tor network for 'z'...rGrHrBrIu[✔] Cinemeta resolved: rgz	) [IMDb: riz5[*] Querying Torrentio aggregator over Tor for IMDb: z...rCz,[*] Querying YTS API releases over Tor for 'z-[*] Querying PirateBay mirrors over Tor for 'u[✔] Successfully cached z releases in Magnet Vault (z).zN[*] Available immediately via Stremio Addon (:7000) and Web Dashboard (:8080).�list�z@[!] Magnet Vault is empty. Run: magnet_vault.py search "<title>"r��IDz<4r�r�r�r�z<5r�r�r�r�r�r�r�r�r�rNz,Usage: magnet_vault.py get <id or info_hash>zJSELECT id, title, quality, info_hash, magnet_uri FROM magnets WHERE id = ?zQSELECT id, title, quality, info_hash, magnet_uri FROM magnets WHERE info_hash = ?z
 198  [!] Item 'z' not found in Magnet Vault.zTitle:     rjzInfoHash:  zMagnetURI: �countzSELECT COUNT(*) FROM magnets;rzMagnet Vault contains z indexed items.z[!] Unknown command 'z"'. Run without arguments for help.)r��sys�argvr��exitrwr2rVrNr��extendr�r�r�r�rrOr��striprr
 199  rr
 200  �isdigitrrv�fetchoner)r+r?r~�	meta_inforGrHrBrF�tio_results�yts_results�tpb_results�	saved_cntr}r��r�midr��szr��h�src�dtr�r�rQrr�rowr��cnts                              r�mainr�]s���
 201  �3�8�8�}�q��
 202  ��	�	�����
 203  
 204  �(�(�1�+�
 205  �
 206  �
 207  �C�
 208  �h���s�x�x�=�1���=�>��H�H�Q�K�������!�"��&��
 209  �.�u�g�T�:�;���%�U�+�	�����y�1�1��	�*�G��g�&�E��V�$�D��|�,�F��-�e�W�B�t�f�I�g�Y�a�P�Q�
 210  �I�'��RU�V�W�*�7�4�H�K��N�N�;�'��w�<�!���@���t�L�M�+�E�2�K��N�N�;�'��w�<�!���A�%���M�N�+�E�2�K��N�N�;�'��G���%�g�.�I��.�y�k�9T�U\�T]�]_�`�a��b�c��
 211  
 212  
 213  ���$'����M�A�$5��C�H�H�Q�K� �2���%� ����V�W��
 214  �i��
 215  ��b�	��Y�r�N�#�g�b�\��V�C�L��H�UX�>�Y\�]d�\e�f�g�
 216  �i���A�<=�9�C��d�B��q�#�r�04�E�7�"�T�F�!�,�%�J�69�*�o��6J�:�c�r�?�T�1�PZ�K��S��H�C��R�y��E�"�:�S��C���C��9�C�P[�}�]�^�	�
 217  	�i��	����s�x�x�=�1���@�A��H�H�Q�K����!��"�"�$���	����w�'���K�K�M���>�>���
 218  �I�I�b�eh�io�ep�dr�s�
 219  �I�I�i�lr�lx�lx�lz�k|�}��j�j�l���
 220  �
 221  ����J�v�h�&B�C�D��H�H�Q�K�#&� ��D�!�S�
 222  ��E�7�"�T�F�!�,�-�
 223  ��A�3�� �
 224  ��C�5�!�"�	����	����w�'���K�K�M��	�	�	�1�2��j�j�l�1�o���
 225  �
 226  ��
 227  �&�s�e�?�;�<�	�%�c�U�*L�M�Nr�__main__)r�)�)�)rc)�)�)%�__doc__r�rrLr
 228  r$�urllib.parser4rxrr"�path�existsr2�dirname�__file__r	rrJru�TORRENTSDB_STREAMr�r�r3rr-r/r<rVr�r�r�r�r�r�r��__name__�rr�<module>r�s����	�����	���	�&(�g�g�n�n�5N�&O�&O�	"�UW�U\�U\�Ua�Ua�bd�bi�bi�bq�bq�rz�b{�~D�VE��
 229  �'�'�,�,�v�|�
 230  ,��V��L��H����<�����:�&�$B�
 231  �8@�D0�d$�L�:��hO�T�z���F�r