Fixed conflict with what site should be searched.
This commit is contained in:
		@@ -44,10 +44,16 @@ class PirateSearch extends Component {
 | 
				
			|||||||
      fetchJSON('https://apollo.kevinmidboe.com/api/v1/pirate/search?query='+query+'&type='+type, 'GET')
 | 
					      fetchJSON('https://apollo.kevinmidboe.com/api/v1/pirate/search?query='+query+'&type='+type, 'GET')
 | 
				
			||||||
      // fetchJSON('http://localhost:31459/api/v1/pirate/search?query='+query+'&type='+type, 'GET')
 | 
					      // fetchJSON('http://localhost:31459/api/v1/pirate/search?query='+query+'&type='+type, 'GET')
 | 
				
			||||||
      .then((response) => {
 | 
					      .then((response) => {
 | 
				
			||||||
 | 
					         console.log('this is the first response: ', response)
 | 
				
			||||||
 | 
					         if (response.success === true) {
 | 
				
			||||||
            this.setState({
 | 
					            this.setState({
 | 
				
			||||||
               torrentResponse: response.torrents,
 | 
					               torrentResponse: response.torrents,
 | 
				
			||||||
               loading: null,
 | 
					               loading: null,
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					         else {
 | 
				
			||||||
 | 
					            console.error(response.message)
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
      .catch((error) => {
 | 
					      .catch((error) => {
 | 
				
			||||||
         console.error(error);
 | 
					         console.error(error);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										196
									
								
								client/app/components/admin/TorrentTable.jsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								client/app/components/admin/TorrentTable.jsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,196 @@
 | 
				
			|||||||
 | 
					import React, { Component } from 'react';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { fetchJSON } from '../http.jsx';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import torrentTableCSS from '../styles/adminTorrentTable.jsx';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TorrentTable extends Component {
 | 
				
			||||||
 | 
					   constructor() {
 | 
				
			||||||
 | 
					      super();
 | 
				
			||||||
 | 
					      this.state = {
 | 
				
			||||||
 | 
					         torrentResponse: [],
 | 
				
			||||||
 | 
					         listElements: undefined,
 | 
				
			||||||
 | 
					         showTable: false,
 | 
				
			||||||
 | 
					         filterQuery: '',
 | 
				
			||||||
 | 
					         sortValue: 'name',
 | 
				
			||||||
 | 
					         sortDesc: true,
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.UNITS = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   componentWillReceiveProps(props) {
 | 
				
			||||||
 | 
					      if (props.response !== undefined && props.response !== this.state.torrentResponse) {
 | 
				
			||||||
 | 
					         console.log('not called', props)
 | 
				
			||||||
 | 
					         this.setState({
 | 
				
			||||||
 | 
					            torrentResponse: props.response,
 | 
				
			||||||
 | 
					            showTable: true,
 | 
				
			||||||
 | 
					         })
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					         this.setState({
 | 
				
			||||||
 | 
					            showTable: false,
 | 
				
			||||||
 | 
					         })
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   // BORROWED FROM GITHUB user sindresorhus
 | 
				
			||||||
 | 
					   // Link to repo: https://github.com/sindresorhus/pretty-bytes
 | 
				
			||||||
 | 
					   convertSizeToHumanSize(num) {
 | 
				
			||||||
 | 
					      if (!Number.isFinite(num)) {
 | 
				
			||||||
 | 
					         throw new TypeError(`Expected a finite number, got ${typeof num}: ${num}`);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      const neg = num < 0;
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      if (neg) {
 | 
				
			||||||
 | 
					         num = -num;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (num < 1) {
 | 
				
			||||||
 | 
					         return (neg ? '-' : '') + num + ' B';
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const exponent = Math.min(Math.floor(Math.log10(num) / 3), this.UNITS.length - 1);
 | 
				
			||||||
 | 
					      const numStr = Number((num / Math.pow(1000, exponent)).toPrecision(3));
 | 
				
			||||||
 | 
					      const unit = this.UNITS[exponent];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return (neg ? '-' : '') + numStr + ' ' + unit;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sendToDownload(magnet) {
 | 
				
			||||||
 | 
					      const apiData = {
 | 
				
			||||||
 | 
					        magnet: magnet,
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      fetchJSON('https://apollo.kevinmidboe.com/api/v1/pirate/add', 'POST', apiData)
 | 
				
			||||||
 | 
					      // fetchJSON('http://localhost:31459/api/v1/pirate/add', 'POST', apiData)
 | 
				
			||||||
 | 
					      .then((response) => {
 | 
				
			||||||
 | 
					         console.log('Response, addMagnet: ', response)
 | 
				
			||||||
 | 
					         // TODO Display the feedback in a notification component (text, status)
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   // Updates the internal state of the query filter and updates the list to only 
 | 
				
			||||||
 | 
					   // display names matching the query. This is real-time filtering.
 | 
				
			||||||
 | 
					   updateFilterQuery(event) {
 | 
				
			||||||
 | 
					      const query = event.target.value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      let filteredByQuery = this.props.response.map((item, index) => {
 | 
				
			||||||
 | 
					         if (item.name.toLowerCase().indexOf(query.toLowerCase()) != -1)
 | 
				
			||||||
 | 
					            return item
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      console.log(filteredByQuery)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.setState({
 | 
				
			||||||
 | 
					         torrentResponse: filteredByQuery,
 | 
				
			||||||
 | 
					         filterQuery: query,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sortTable(col) {
 | 
				
			||||||
 | 
					      let direction = this.state.sortDesc;
 | 
				
			||||||
 | 
					      if (col === this.state.sortValue) 
 | 
				
			||||||
 | 
					         direction = !direction;
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					         direction = true
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      let sortedItems = this.state.torrentResponse.sort((a,b) => {
 | 
				
			||||||
 | 
					         // This is so we also can sort string that only contain numbers
 | 
				
			||||||
 | 
					         let valueA = isNaN(a[col]) ? a[col] : parseInt(a[col])
 | 
				
			||||||
 | 
					         let valueB = isNaN(b[col]) ? b[col] : parseInt(b[col])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         if (direction)
 | 
				
			||||||
 | 
					            return valueA<valueB? 1:valueA>valueB?-1:0;
 | 
				
			||||||
 | 
					         else
 | 
				
			||||||
 | 
					            return valueA>valueB? 1:valueA<valueB?-1:0;
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.setState({
 | 
				
			||||||
 | 
					         torrentResponse: sortedItems,
 | 
				
			||||||
 | 
					         sortDesc: direction,
 | 
				
			||||||
 | 
					         sortValue: col,
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   generateFilterSearch() {
 | 
				
			||||||
 | 
					      return (
 | 
				
			||||||
 | 
					         <div style={torrentTableCSS.searchSidebar}>
 | 
				
			||||||
 | 
					            <div style={torrentTableCSS.searchInner}>
 | 
				
			||||||
 | 
					               <input
 | 
				
			||||||
 | 
					                  type="text" 
 | 
				
			||||||
 | 
					                  id="search"
 | 
				
			||||||
 | 
					                  style={torrentTableCSS.searchTextField}
 | 
				
			||||||
 | 
					                  placeholder="Filter torrents by query" 
 | 
				
			||||||
 | 
					                  onChange={event => this.updateFilterQuery(event)}
 | 
				
			||||||
 | 
					                  value={this.state.filterQuery}/>
 | 
				
			||||||
 | 
					               <span>
 | 
				
			||||||
 | 
					                  <svg id="icon-search" style={torrentTableCSS.searchIcon} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 15">
 | 
				
			||||||
 | 
					                     <g id="search">
 | 
				
			||||||
 | 
					                        <circle style={torrentTableCSS.searchSVGIcon} cx="6.055" cy="5.805" r="5.305"></circle>
 | 
				
			||||||
 | 
					                        <path style={torrentTableCSS.searchSVGIcon} d="M9.847 9.727l4.166 4.773"></path>
 | 
				
			||||||
 | 
					                     </g>
 | 
				
			||||||
 | 
					                  </svg>
 | 
				
			||||||
 | 
					               </span>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					         </div>
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   generateListElements() {
 | 
				
			||||||
 | 
					      let listElements = this.state.torrentResponse.map((item, index) => {
 | 
				
			||||||
 | 
					         if (item !== undefined) {
 | 
				
			||||||
 | 
					            let title = item.name
 | 
				
			||||||
 | 
					            let size = this.convertSizeToHumanSize(item.size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return (
 | 
				
			||||||
 | 
					               <tr key={index} style={torrentTableCSS.bodyCol}>
 | 
				
			||||||
 | 
					                  <td>{ item.name }</td>
 | 
				
			||||||
 | 
					                  <td>{ item.uploader }</td>
 | 
				
			||||||
 | 
					                  <td>{ size }</td>
 | 
				
			||||||
 | 
					                  <td>{ item.seed }</td>
 | 
				
			||||||
 | 
					                  <td><button onClick = { event => this.sendToDownload(item.magnet) }>Send to download</button></td>
 | 
				
			||||||
 | 
					               </tr>
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      return listElements
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   render() {
 | 
				
			||||||
 | 
					      return (
 | 
				
			||||||
 | 
					         <div style= { this.state.showTable ? null : {display: 'none'}}>
 | 
				
			||||||
 | 
					            { this.generateFilterSearch() }
 | 
				
			||||||
 | 
					            <table style={torrentTableCSS.table} cellSpacing="0" cellPadding="0">
 | 
				
			||||||
 | 
					               <thead>
 | 
				
			||||||
 | 
					                  <tr>
 | 
				
			||||||
 | 
					                     <th style={torrentTableCSS.col} onClick = {event => this.sortTable('name') }>
 | 
				
			||||||
 | 
					                        Title
 | 
				
			||||||
 | 
					                        <svg style={ ( this.state.sortDesc && this.state.sortValue == 'name' ) ? null : {transform: 'rotate(180deg)'} } height="15" viewBox="0 3.5 10 13" version="1.1" width="25" aria-hidden="true"><path fillRule="evenodd" d="M10 10l-1.5 1.5L5 7.75 1.5 11.5 0 10l5-5z"></path></svg>
 | 
				
			||||||
 | 
					                     </th>
 | 
				
			||||||
 | 
					                     <th style={torrentTableCSS.col} onClick = {event => this.sortTable('uploader') }>
 | 
				
			||||||
 | 
					                        Uploader
 | 
				
			||||||
 | 
					                        <svg style={ ( this.state.sortDesc && this.state.sortValue == 'uploader' ) ? null : {transform: 'rotate(180deg)'} } height="15" viewBox="0 3.5 10 13" version="1.1" width="25" aria-hidden="true"><path fillRule="evenodd" d="M10 10l-1.5 1.5L5 7.75 1.5 11.5 0 10l5-5z"></path></svg>
 | 
				
			||||||
 | 
					                     </th>
 | 
				
			||||||
 | 
					                     <th style={torrentTableCSS.col} onClick = {event => this.sortTable('size') }>
 | 
				
			||||||
 | 
					                        Size
 | 
				
			||||||
 | 
					                        <svg style={ ( this.state.sortDesc && this.state.sortValue == 'size' ) ? null : {transform: 'rotate(180deg)'} } height="15" viewBox="0 3.5 10 13" version="1.1" width="25" aria-hidden="true"><path fillRule="evenodd" d="M10 10l-1.5 1.5L5 7.75 1.5 11.5 0 10l5-5z"></path></svg>
 | 
				
			||||||
 | 
					                     </th>
 | 
				
			||||||
 | 
					                     <th style={torrentTableCSS.col} onClick = {event => this.sortTable('seed') }>
 | 
				
			||||||
 | 
					                        Seeds
 | 
				
			||||||
 | 
					                        <svg style={ ( this.state.sortDesc && this.state.sortValue == 'seed' ) ? null : {transform: 'rotate(180deg)'} } height="15" viewBox="0 3.5 10 13" version="1.1" width="25" aria-hidden="true"><path fillRule="evenodd" d="M10 10l-1.5 1.5L5 7.75 1.5 11.5 0 10l5-5z"></path></svg>
 | 
				
			||||||
 | 
					                     </th>
 | 
				
			||||||
 | 
					                     <th style={torrentTableCSS.col}>Magnet</th>
 | 
				
			||||||
 | 
					                  </tr>
 | 
				
			||||||
 | 
					               </thead>
 | 
				
			||||||
 | 
					               <tbody>
 | 
				
			||||||
 | 
					                  {this.generateListElements()}
 | 
				
			||||||
 | 
					               </tbody>
 | 
				
			||||||
 | 
					            </table>
 | 
				
			||||||
 | 
					         </div>
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default TorrentTable;
 | 
				
			||||||
@@ -4,6 +4,17 @@ export default {
 | 
				
			|||||||
      marginRight: 'auto',
 | 
					      marginRight: 'auto',
 | 
				
			||||||
      marginLeft: 'auto',
 | 
					      marginLeft: 'auto',
 | 
				
			||||||
   },
 | 
					   },
 | 
				
			||||||
 | 
					   tableHeader: {
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					   col: {
 | 
				
			||||||
 | 
					      cursor: 'pointer',
 | 
				
			||||||
 | 
					      borderBottom: '1px solid #e0e0e0',
 | 
				
			||||||
 | 
					      paddingBottom: '0.5em',
 | 
				
			||||||
 | 
					      textAlign: 'left',
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					   bodyCol: {
 | 
				
			||||||
 | 
					      marginTop: '0.5em',
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   searchSidebar: {
 | 
					   searchSidebar: {
 | 
				
			||||||
      height: '4em',
 | 
					      height: '4em',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +1,13 @@
 | 
				
			|||||||
const assert = require('assert');
 | 
					const assert = require('assert');
 | 
				
			||||||
var PythonShell = require('python-shell');
 | 
					var PythonShell = require('python-shell');
 | 
				
			||||||
var async = require('async');
 | 
					var async = require('async');
 | 
				
			||||||
var PythonShell = require('python-shell');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function find(searchterm, callback) {
 | 
					async function find(searchterm, callback) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  var options = {
 | 
					  var options = {
 | 
				
			||||||
		pythonPath: '/usr/bin/python3', 
 | 
							pythonPath: '/usr/bin/python3', 
 | 
				
			||||||
		// pythonPath: '/Library/Frameworks/Python.framework/Versions/3.6/bin/python3',
 | 
							// pythonPath: '/Library/Frameworks/Python.framework/Versions/3.6/bin/python3',
 | 
				
			||||||
		args: [searchterm, '-s', 'jackett', '--print']
 | 
							args: [searchterm, '-s', 'piratebay', '--print']
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PythonShell.run('../app/torrent_search/torrentSearch/search.py', options, callback);
 | 
						PythonShell.run('../app/torrent_search/torrentSearch/search.py', options, callback);
 | 
				
			||||||
@@ -27,10 +26,16 @@ async function callPythonAddMagnet(magnet, callback) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function SearchPiratebay(query) {
 | 
					async function SearchPiratebay(query) {
 | 
				
			||||||
	return await new Promise((resolve) => {
 | 
						return await new Promise((resolve, reject) => {
 | 
				
			||||||
		return find(query, function(err, results) {
 | 
							return find(query, function(err, results) {
 | 
				
			||||||
			console.log('err', err, '. result', results);
 | 
								if (err) {
 | 
				
			||||||
 | 
									console.log('THERE WAS A FUCKING ERROR!')
 | 
				
			||||||
 | 
									reject(Error('There was a error when searching for torrents'))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (results) {
 | 
				
			||||||
 | 
									console.log('result', results);
 | 
				
			||||||
				resolve(JSON.parse(results, null, '\t'));
 | 
									resolve(JSON.parse(results, null, '\t'));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user