Gazelle/sections/upload/upload_handle.php

1062 lines
37 KiB
PHP
Raw Normal View History

2011-03-28 14:21:28 +00:00
<?
//******************************************************************************//
//--------------- Take upload --------------------------------------------------//
2013-02-07 08:00:47 +00:00
// This pages handles the backend of the torrent upload function. It checks //
// the data, and if it all validates, it builds the torrent file, then writes //
2011-03-28 14:21:28 +00:00
// the data to the database and the torrent to the disk. //
//******************************************************************************//
2013-06-27 08:01:06 +00:00
// Maximum allowed size for uploaded files.
// http://php.net/upload-max-filesize
ini_set('upload_max_filesize', 2097152); // 2 Mibibytes
2013-03-13 08:00:43 +00:00
ini_set('max_file_uploads', 100);
2012-05-18 13:35:17 +00:00
define(MAX_FILENAME_LENGTH, 180);
2013-05-27 08:00:58 +00:00
include(SERVER_ROOT.'/classes/validate.class.php');
include(SERVER_ROOT.'/classes/feed.class.php');
include(SERVER_ROOT.'/classes/text.class.php');
2011-03-28 14:21:28 +00:00
include(SERVER_ROOT.'/sections/torrents/functions.php');
2013-05-27 08:00:58 +00:00
include(SERVER_ROOT.'/classes/file_checker.class.php');
2011-03-28 14:21:28 +00:00
enforce_login();
authorize();
$Validate = new VALIDATE;
$Feed = new FEED;
$Text = new TEXT;
define('QUERY_EXCEPTION',true); // Shut up debugging
//******************************************************************************//
//--------------- Set $Properties array ----------------------------------------//
2013-02-07 08:00:47 +00:00
// This is used if the form doesn't validate, and when the time comes to enter //
2011-03-28 14:21:28 +00:00
// it into the database. //
$Properties=array();
$Type = $Categories[(int)$_POST['type']];
$TypeID = $_POST['type'] + 1;
2011-09-30 08:00:12 +00:00
$Properties['CategoryName'] = $Type;
2011-03-28 14:21:28 +00:00
$Properties['Title'] = $_POST['title'];
2013-05-23 08:01:12 +00:00
$Properties['Remastered'] = ((isset($_POST['remaster'])) ? 1 : 0);
2013-04-15 08:00:54 +00:00
if ($Properties['Remastered'] || isset($_POST['unknown'])) {
2013-05-23 08:01:12 +00:00
$Properties['UnknownRelease'] = ((isset($_POST['unknown'])) ? 1 : 0);
2011-03-28 14:21:28 +00:00
$Properties['RemasterYear'] = $_POST['remaster_year'];
$Properties['RemasterTitle'] = $_POST['remaster_title'];
$Properties['RemasterRecordLabel'] = $_POST['remaster_record_label'];
$Properties['RemasterCatalogueNumber'] = $_POST['remaster_catalogue_number'];
}
2013-04-15 08:00:54 +00:00
if (!$Properties['Remastered'] || $Properties['UnknownRelease']) {
2011-03-28 14:21:28 +00:00
$Properties['UnknownRelease'] = 1;
$Properties['RemasterYear'] = '';
$Properties['RemasterTitle'] = '';
$Properties['RemasterRecordLabel'] = '';
$Properties['RemasterCatalogueNumber'] = '';
}
$Properties['Year'] = $_POST['year'];
$Properties['RecordLabel'] = $_POST['record_label'];
$Properties['CatalogueNumber'] = $_POST['catalogue_number'];
$Properties['ReleaseType'] = $_POST['releasetype'];
2013-05-23 08:01:12 +00:00
$Properties['Scene'] = ((isset($_POST['scene'])) ? 1 : 0);
2011-03-28 14:21:28 +00:00
$Properties['Format'] = $_POST['format'];
$Properties['Media'] = $_POST['media'];
$Properties['Bitrate'] = $_POST['bitrate'];
$Properties['Encoding'] = $_POST['bitrate'];
2012-03-08 08:00:24 +00:00
$Properties['LibraryImage'] = $_POST['library_image'];
$Properties['MultiDisc'] = $_POST['multi_disc'];
2011-03-28 14:21:28 +00:00
$Properties['TagList'] = $_POST['tags'];
$Properties['Image'] = $_POST['image'];
$Properties['GroupDescription'] = trim($_POST['album_desc']);
if ($_POST['vanity_house'] && check_perms('torrents_edit_vanityhouse') ) {
$Properties['VanityHouse'] = 1;
} else {
$Properties['VanityHouse'] = 0;
}
2011-03-28 14:21:28 +00:00
$Properties['TorrentDescription'] = $_POST['release_desc'];
2013-04-15 08:00:54 +00:00
if ($_POST['album_desc']) {
2011-03-28 14:21:28 +00:00
$Properties['GroupDescription'] = trim($_POST['album_desc']);
2013-04-20 08:01:01 +00:00
} elseif ($_POST['desc']) {
2011-03-28 14:21:28 +00:00
$Properties['GroupDescription'] = trim($_POST['desc']);
}
$Properties['GroupID'] = $_POST['groupid'];
2013-04-15 08:00:54 +00:00
if (empty($_POST['artists'])) {
2011-03-28 14:21:28 +00:00
$Err = "You didn't enter any artists";
} else {
$Artists = $_POST['artists'];
$Importance = $_POST['importance'];
}
$RequestID = $_POST['requestid'];
//******************************************************************************//
//--------------- Validate data in upload form ---------------------------------//
2013-05-23 08:01:12 +00:00
$Validate->SetFields('type','1','inarray','Please select a valid type.', array('inarray'=>array_keys($Categories)));
2011-03-28 14:21:28 +00:00
switch ($Type) {
case 'Music':
2013-04-15 08:00:54 +00:00
if (!$_POST['groupid']) {
2011-03-28 14:21:28 +00:00
$Validate->SetFields('title',
2013-05-23 08:01:12 +00:00
'1','string','Title must be between 1 and 200 characters.', array('maxlength'=>200, 'minlength'=>1));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('year',
2013-05-23 08:01:12 +00:00
'1','number','The year of the original release must be entered.', array('length'=>40));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('releasetype',
2013-05-23 08:01:12 +00:00
'1','inarray','Please select a valid release type.', array('inarray'=>array_keys($ReleaseTypes)));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('tags',
2013-05-23 08:01:12 +00:00
'1','string','You must enter at least one tag. Maximum length is 200 characters.', array('maxlength'=>200, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('record_label',
2013-05-23 08:01:12 +00:00
'0','string','Record label must be between 2 and 80 characters.', array('maxlength'=>80, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('catalogue_number',
2013-05-23 08:01:12 +00:00
'0','string','Catalogue Number must be between 2 and 80 characters.', array('maxlength'=>80, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('album_desc',
2013-05-23 08:01:12 +00:00
'1','string','The album description has a minimum length of 10 characters.', array('maxlength'=>1000000, 'minlength'=>10));
if ($Properties['Media'] == 'CD' && !$Properties['Remastered']) {
$Validate->SetFields('year', '1', 'number', 'You have selected a year for an album that predates the media you say it was created on.', array('minlength'=>1982));
}
2011-03-28 14:21:28 +00:00
}
2013-04-20 08:01:01 +00:00
if ($Properties['Remastered'] && !$Properties['UnknownRelease']) {
2011-03-28 14:21:28 +00:00
$Validate->SetFields('remaster_year',
'1','number','Year of remaster/re-issue must be entered.');
} else {
$Validate->SetFields('remaster_year',
'0','number','Invalid remaster year.');
}
if ($Properties['Media'] == 'CD' && $Properties['Remastered']) {
$Validate->SetFields('remaster_year', '1', 'number', 'You have selected a year for an album that predates the media you say it was created on.', array('minlength'=>1982));
2011-03-28 14:21:28 +00:00
}
$Validate->SetFields('remaster_title',
2013-05-23 08:01:12 +00:00
'0','string','Remaster title must be between 2 and 80 characters.', array('maxlength'=>80, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
if ($Properties['RemasterTitle'] == 'Original Release') {
$Validate->SetFields('remaster_title', '0', 'string', '"Orginal Release" is not a valid remaster title.');
}
$Validate->SetFields('remaster_record_label',
2013-05-23 08:01:12 +00:00
'0','string','Remaster record label must be between 2 and 80 characters.', array('maxlength'=>80, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('remaster_catalogue_number',
2013-05-23 08:01:12 +00:00
'0','string','Remaster catalogue number must be between 2 and 80 characters.', array('maxlength'=>80, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('format',
2013-05-23 08:01:12 +00:00
'1','inarray','Please select a valid format.', array('inarray'=>$Formats));
2011-03-28 14:21:28 +00:00
// Handle 'other' bitrates
2013-04-15 08:00:54 +00:00
if ($Properties['Encoding'] == 'Other') {
2011-03-28 14:21:28 +00:00
if ($Properties['Format'] == 'FLAC') {
$Validate->SetFields('bitrate',
'1','string','FLAC bitrate must be lossless.', array('regex'=>'/Lossless/'));
}
$Validate->SetFields('other_bitrate',
'1','string','You must enter the other bitrate (max length: 9 characters).', array('maxlength'=>9));
$enc = trim($_POST['other_bitrate']);
2013-05-23 08:01:12 +00:00
if (isset($_POST['vbr'])) {
$enc.= ' (VBR)';
}
2011-03-28 14:21:28 +00:00
$Properties['Encoding'] = $enc;
$Properties['Bitrate'] = $enc;
} else {
$Validate->SetFields('bitrate',
'1','inarray','You must choose a bitrate.', array('inarray'=>$Bitrates));
}
$Validate->SetFields('media',
2013-05-23 08:01:12 +00:00
'1','inarray','Please select a valid media.', array('inarray'=>$Media));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('image',
2013-05-23 08:01:12 +00:00
'0','link','The image URL you entered was invalid.', array('maxlength'=>255, 'minlength'=>12));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('release_desc',
2013-05-23 08:01:12 +00:00
'0','string','The release description has a minimum length of 10 characters.', array('maxlength'=>1000000, 'minlength'=>10));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('groupid', '0', 'number', 'Group ID was not numeric');
break;
case 'Audiobooks':
case 'Comedy':
$Validate->SetFields('title',
2013-05-23 08:01:12 +00:00
'1','string','Title must be between 2 and 200 characters.', array('maxlength'=>200, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('year',
'1','number','The year of the release must be entered.');
$Validate->SetFields('format',
2013-05-23 08:01:12 +00:00
'1','inarray','Please select a valid format.', array('inarray'=>$Formats));
2011-03-28 14:21:28 +00:00
2013-04-15 08:00:54 +00:00
if ($Properties['Encoding'] == 'Other') {
2011-03-28 14:21:28 +00:00
$Validate->SetFields('other_bitrate',
'1','string','You must enter the other bitrate (max length: 9 characters).', array('maxlength'=>9));
$enc = trim($_POST['other_bitrate']);
2013-05-23 08:01:12 +00:00
if (isset($_POST['vbr'])) {
$enc.= ' (VBR)';
}
2011-03-28 14:21:28 +00:00
$Properties['Encoding'] = $enc;
$Properties['Bitrate'] = $enc;
} else {
$Validate->SetFields('bitrate',
'1','inarray','You must choose a bitrate.', array('inarray'=>$Bitrates));
}
$Validate->SetFields('album_desc',
2013-05-23 08:01:12 +00:00
'1','string','You must enter a proper audiobook description.', array('maxlength'=>1000000, 'minlength'=>10));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('tags',
2013-05-23 08:01:12 +00:00
'1','string','You must enter at least one tag. Maximum length is 200 characters.', array('maxlength'=>200, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('release_desc',
2013-05-23 08:01:12 +00:00
'0','string','The release description has a minimum length of 10 characters.', array('maxlength'=>1000000, 'minlength'=>10));
2011-03-28 14:21:28 +00:00
2012-02-17 08:00:18 +00:00
$Validate->SetFields('image',
2013-05-23 08:01:12 +00:00
'0','link','The image URL you entered was invalid.', array('maxlength'=>255, 'minlength'=>12));
2011-03-28 14:21:28 +00:00
break;
case 'Applications':
case 'Comics':
case 'E-Books':
case 'E-Learning Videos':
$Validate->SetFields('title',
2013-05-23 08:01:12 +00:00
'1','string','Title must be between 2 and 200 characters.', array('maxlength'=>200, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('tags',
2013-05-23 08:01:12 +00:00
'1','string','You must enter at least one tag. Maximum length is 200 characters.', array('maxlength'=>200, 'minlength'=>2));
2011-03-28 14:21:28 +00:00
$Validate->SetFields('release_desc',
2013-05-23 08:01:12 +00:00
'0','string','The release description has a minimum length of 10 characters.', array('maxlength'=>1000000, 'minlength'=>10));
2013-02-22 08:00:24 +00:00
2012-02-17 08:00:18 +00:00
$Validate->SetFields('image',
2013-05-23 08:01:12 +00:00
'0','link','The image URL you entered was invalid.', array('maxlength'=>255, 'minlength'=>12));
2011-03-28 14:21:28 +00:00
break;
}
$Validate->SetFields('rules',
'1','require','Your torrent must abide by the rules.');
2013-05-23 08:01:12 +00:00
$Err = $Validate->ValidateForm($_POST); // Validate the form
2011-03-28 14:21:28 +00:00
$File = $_FILES['file_input']; // This is our torrent file
$TorrentName = $File['tmp_name'];
if (!is_uploaded_file($TorrentName) || !filesize($TorrentName)) {
2013-05-23 08:01:12 +00:00
$Err = 'No torrent file uploaded, or file is empty.';
2013-04-15 08:00:54 +00:00
} elseif (substr(strtolower($File['name']), strlen($File['name']) - strlen('.torrent')) !== '.torrent') {
2011-03-28 14:21:28 +00:00
$Err = "You seem to have put something other than a torrent file into the upload field. (".$File['name'].").";
}
2013-04-15 08:00:54 +00:00
if ($Type == 'Music') {
2012-11-14 08:00:19 +00:00
include(SERVER_ROOT.'/sections/upload/get_extra_torrents.php');
}
2011-03-28 14:21:28 +00:00
$LogScoreAverage = 0;
2013-04-15 08:00:54 +00:00
if (!$Err && $Properties['Format'] == 'FLAC') {
2011-03-28 14:21:28 +00:00
foreach ($_FILES['logfiles']['name'] as $FileName) {
2013-04-15 08:00:54 +00:00
if (!empty($FileName) && substr(strtolower($FileName), strlen($FileName) - strlen('.log')) !== '.log') {
$Err = 'You seem to have put something other than an EAC or XLD log file into an upload field. ('.$FileName.').';
2011-03-28 14:21:28 +00:00
break;
}
}
//There is absolutely no point in checking the type of the file upload as its interpretation of the type is decided by the client.
2013-04-15 08:00:54 +00:00
/* foreach ($_FILES['logfiles']['type'] as $FileType) {
if (!empty($FileType) && $FileType != "text/plain" && $FileType != "text/x-log" && $FileType != "application/octet-stream" && $FileType != "text/richtext") {
$Err = "You seem to have put something other than an EAC or XLD log file into an upload field. (".$FileType.")";
break;
}
}
*/
2011-03-28 14:21:28 +00:00
}
//Multiple artists!
$LogName = '';
2013-05-23 08:01:12 +00:00
if (empty($Properties['GroupID']) && empty($ArtistForm) && $Type == 'Music') {
2011-03-28 14:21:28 +00:00
$MainArtistCount = 0;
$ArtistNames = array();
$ArtistForm = array(
1 => array(),
2 => array(),
2011-11-20 08:00:18 +00:00
3 => array(),
4 => array(),
2011-11-22 08:00:17 +00:00
5 => array(),
6 => array()
2011-03-28 14:21:28 +00:00
);
2013-04-24 08:00:23 +00:00
for ($i = 0, $il = count($Artists); $i < $il; $i++) {
2013-04-15 08:00:54 +00:00
if (trim($Artists[$i]) != '') {
if (!in_array($Artists[$i], trim($ArtistNames))) {
2012-10-11 08:00:15 +00:00
$ArtistForm[$Importance[$i]][] = array('name' => Artists::normalise_artist_name($Artists[$i]));
2013-04-15 08:00:54 +00:00
if ($Importance[$i] == 1) {
2011-03-28 14:21:28 +00:00
$MainArtistCount++;
}
$ArtistNames[] = trim($Artists[$i]);
}
}
}
2013-04-15 08:00:54 +00:00
if ($MainArtistCount < 1) {
$Err = 'Please enter at least one main artist';
2011-03-28 14:21:28 +00:00
$ArtistForm = array();
}
2012-10-11 08:00:15 +00:00
$LogName .= Artists::display_artists($ArtistForm, false, true, false);
2013-04-15 08:00:54 +00:00
} elseif ($Type == 'Music' && empty($ArtistForm)) {
2013-05-23 08:01:12 +00:00
$DB->query("
SELECT ta.ArtistID, aa.Name, ta.Importance
FROM torrents_artists AS ta
JOIN artists_alias AS aa ON ta.AliasID = aa.AliasID
WHERE ta.GroupID = ".$Properties['GroupID']."
ORDER BY ta.Importance ASC, aa.Name ASC;");
2013-04-15 08:00:54 +00:00
while (list($ArtistID,$ArtistName,$ArtistImportance) = $DB->next_record(MYSQLI_BOTH, false)) {
2011-03-28 14:21:28 +00:00
$ArtistForm[$ArtistImportance][] = array('id' => $ArtistID, 'name' => display_str($ArtistName));
$ArtistsUnescaped[$ArtistImportance][] = array('name' => $ArtistName);
}
2012-10-11 08:00:15 +00:00
$LogName .= Artists::display_artists($ArtistsUnescaped, false, true, false);
2011-03-28 14:21:28 +00:00
}
2013-04-15 08:00:54 +00:00
if ($Err) { // Show the upload form, with the data the user entered
2013-05-23 08:01:12 +00:00
$UploadForm = $Type;
2011-03-28 14:21:28 +00:00
include(SERVER_ROOT.'/sections/upload/upload.php');
die();
}
2013-07-05 08:00:39 +00:00
// Strip out Amazon's padding
2011-11-22 08:00:17 +00:00
$AmazonReg = '/(http:\/\/ecx.images-amazon.com\/images\/.+)(\._.*_\.jpg)/i';
$Matches = array();
if (preg_match($RegX, $Properties['Image'], $Matches)) {
$Properties['Image'] = $Matches[1].'.jpg';
}
2013-02-25 21:16:55 +00:00
ImageTools::blacklisted($Properties['Image']);
2011-11-22 08:00:17 +00:00
2011-03-28 14:21:28 +00:00
//******************************************************************************//
//--------------- Make variables ready for database input ----------------------//
// Shorten and escape $Properties for database input
$T = array();
foreach ($Properties as $Key => $Value) {
2013-07-05 08:00:39 +00:00
$T[$Key] = "'".db_string(trim($Value))."'";
2013-04-15 08:00:54 +00:00
if (!$T[$Key]) {
2011-03-28 14:21:28 +00:00
$T[$Key] = NULL;
}
}
$SearchText = db_string(trim($Properties['Artist']).' '.trim($Properties['Title']).' '.trim($Properties['Year']));
//******************************************************************************//
//--------------- Generate torrent file ----------------------------------------//
2013-03-17 08:00:17 +00:00
$Tor = new BencodeTorrent($TorrentName, true);
2013-02-25 21:16:55 +00:00
$PublicTorrent = $Tor->make_private(); // The torrent is now private.
$TorEnc = db_string($Tor->encode());
$InfoHash = pack('H*', $Tor->info_hash());
2011-03-28 14:21:28 +00:00
2013-05-23 08:01:12 +00:00
$DB->query("
SELECT ID
FROM torrents
2013-07-05 08:00:39 +00:00
WHERE info_hash = '".db_string($InfoHash)."'");
2013-07-10 00:08:53 +00:00
if ($DB->has_results()) {
2013-02-25 21:16:55 +00:00
list($ID) = $DB->next_record();
2013-05-23 08:01:12 +00:00
$DB->query("
SELECT TorrentID
FROM torrents_files
2013-07-05 08:00:39 +00:00
WHERE TorrentID = $ID");
2013-07-10 00:08:53 +00:00
if ($DB->has_results()) {
2013-02-25 21:16:55 +00:00
$Err = '<a href="torrents.php?torrentid='.$ID.'">The exact same torrent file already exists on the site!</a>';
} else {
// A lost torrent
2013-05-23 08:01:12 +00:00
$DB->query("
INSERT INTO torrents_files (TorrentID, File)
VALUES ($ID, '$TorEnc')");
2013-02-25 21:16:55 +00:00
$Err = '<a href="torrents.php?torrentid='.$ID.'">Thank you for fixing this torrent</a>';
}
}
2011-03-28 14:21:28 +00:00
2013-02-25 21:16:55 +00:00
if (isset($Tor->Dec['encrypted_files'])) {
2013-07-05 08:00:39 +00:00
$Err = 'This torrent contains an encrypted file list which is not supported here.';
2013-02-16 08:00:57 +00:00
}
2011-03-28 14:21:28 +00:00
// File list and size
list($TotalSize, $FileList) = $Tor->file_list();
2013-02-25 21:16:55 +00:00
$NumFiles = count($FileList);
$HasLog = 0;
$HasCue = 0;
2011-03-28 14:21:28 +00:00
$TmpFileList = array();
2012-12-19 08:00:21 +00:00
$TooLongPaths = array();
2013-05-23 08:01:12 +00:00
$DirName = (isset($Tor->Dec['info']['files']) ? Format::make_utf8($Tor->get_name()) : '');
2013-06-27 08:01:06 +00:00
check_name($DirName); // check the folder name against the blacklist
2013-02-25 21:16:55 +00:00
foreach ($FileList as $File) {
2011-03-28 14:21:28 +00:00
list($Size, $Name) = $File;
// add +log to encoding
2013-02-25 21:16:55 +00:00
if ($T['Encoding'] == "'Lossless'" && preg_match('/(?<!audiochecker)\.log$/i', $Name)) {
$HasLog = 1;
2011-03-28 14:21:28 +00:00
}
// add +cue to encoding
2013-02-25 21:16:55 +00:00
if ($T['Encoding'] == "'Lossless'" && preg_match('/\.cue$/i', $Name)) {
$HasCue = 1;
2011-03-28 14:21:28 +00:00
}
2013-02-25 21:16:55 +00:00
// Check file name and extension against blacklist/whitelist
2012-06-18 08:00:14 +00:00
check_file($Type, $Name);
2012-05-18 13:35:17 +00:00
// Make sure the filename is not too long
2013-02-25 21:16:55 +00:00
if (mb_strlen($Name, 'UTF-8') + mb_strlen($DirName, 'UTF-8') + 1 > MAX_FILENAME_LENGTH) {
2013-03-13 08:00:43 +00:00
$TooLongPaths[] = "$DirName/$Name";
2012-05-18 13:35:17 +00:00
}
2013-02-11 08:00:34 +00:00
// Add file info to array
$TmpFileList[] = Torrents::filelist_format_file($File);
2011-03-28 14:21:28 +00:00
}
2013-02-25 21:16:55 +00:00
if (count($TooLongPaths) > 0) {
2013-03-13 08:00:43 +00:00
$Names = implode(' <br />', $TooLongPaths);
$Err = "The torrent contained one or more files with too long a name:<br /> $Names";
2012-12-19 08:00:21 +00:00
}
2013-02-25 08:00:45 +00:00
$FilePath = db_string($DirName);
2013-02-11 08:00:34 +00:00
$FileString = db_string(implode("\n", $TmpFileList));
2013-02-17 08:00:08 +00:00
$Debug->set_flag('upload: torrent decoded');
2011-03-28 14:21:28 +00:00
2013-02-25 21:16:55 +00:00
if ($Type == 'Music') {
2012-11-14 08:00:19 +00:00
include(SERVER_ROOT.'/sections/upload/generate_extra_torrents.php');
}
2011-03-28 14:21:28 +00:00
2013-02-25 21:16:55 +00:00
if (!empty($Err)) { // Show the upload form, with the data the user entered
$UploadForm = $Type;
2011-03-28 14:21:28 +00:00
include(SERVER_ROOT.'/sections/upload/upload.php');
die();
}
//******************************************************************************//
//--------------- Start database stuff -----------------------------------------//
$Body = $Properties['GroupDescription'];
// Trickery
2013-07-05 08:00:39 +00:00
if (!preg_match('/^'.IMAGE_REGEX.'$/i', $Properties['Image'])) {
$Properties['Image'] = '';
$T['Image'] = "''";
}
2011-03-28 14:21:28 +00:00
2013-04-15 08:00:54 +00:00
if ($Type == 'Music') {
2011-03-28 14:21:28 +00:00
// Does it belong in a group?
2013-04-15 08:00:54 +00:00
if ($Properties['GroupID']) {
2011-03-28 14:21:28 +00:00
$DB->query("
2013-05-23 08:01:12 +00:00
SELECT
tg.id,
tg.WikiImage,
tg.WikiBody,
tg.RevisionID,
tg.Name,
tg.Year,
tg.ReleaseType,
tg.TagList
FROM torrents_group AS tg
WHERE tg.id = ".$Properties['GroupID']);
2013-07-10 00:08:53 +00:00
if ($DB->has_results()) {
2012-08-30 08:00:17 +00:00
// Don't escape tg.Name. It's written directly to the log table
list($GroupID, $WikiImage, $WikiBody, $RevisionID, $Properties['Title'], $Properties['Year'], $Properties['ReleaseType'], $Properties['TagList']) = $DB->next_record(MYSQLI_NUM, array(4));
2013-05-23 08:01:12 +00:00
$Properties['TagList'] = str_replace(array(' ', '.', '_'), array(', ', '.', '.'), $Properties['TagList']);
2013-04-20 08:01:01 +00:00
if (!$Properties['Image'] && $WikiImage) {
2011-03-28 14:21:28 +00:00
$Properties['Image'] = $WikiImage;
$T['Image'] = "'".db_string($WikiImage)."'";
}
2013-04-20 08:01:01 +00:00
if (strlen($WikiBody) > strlen($Body)) {
2011-03-28 14:21:28 +00:00
$Body = $WikiBody;
2013-04-15 08:00:54 +00:00
if (!$Properties['Image'] || $Properties['Image'] == $WikiImage) {
2011-03-28 14:21:28 +00:00
$NoRevision = true;
}
}
2012-10-11 08:00:15 +00:00
$Properties['Artist'] = Artists::display_artists(Artists::get_artist($GroupID), false, false);
2011-03-28 14:21:28 +00:00
}
}
2013-04-15 08:00:54 +00:00
if (!$GroupID) {
foreach ($ArtistForm as $Importance => $Artists) {
foreach ($Artists as $Num => $Artist) {
2011-03-28 14:21:28 +00:00
$DB->query("
SELECT
2013-04-15 08:00:54 +00:00
tg.id,
tg.WikiImage,
tg.WikiBody,
tg.RevisionID
2011-03-28 14:21:28 +00:00
FROM torrents_group AS tg
2013-07-05 08:00:39 +00:00
LEFT JOIN torrents_artists AS ta ON ta.GroupID = tg.ID
2013-04-15 08:00:54 +00:00
LEFT JOIN artists_group AS ag ON ta.ArtistID = ag.ArtistID
2012-06-02 08:00:16 +00:00
WHERE ag.Name = '".db_string($Artist['name'])."'
2013-04-15 08:00:54 +00:00
AND tg.Name = ".$T['Title']."
AND tg.ReleaseType = ".$T['ReleaseType']."
AND tg.Year = ".$T['Year']);
2011-03-28 14:21:28 +00:00
2013-07-10 00:08:53 +00:00
if ($DB->has_results()) {
2011-03-28 14:21:28 +00:00
list($GroupID, $WikiImage, $WikiBody, $RevisionID) = $DB->next_record();
2013-04-15 08:00:54 +00:00
if (!$Properties['Image'] && $WikiImage) {
2011-03-28 14:21:28 +00:00
$Properties['Image'] = $WikiImage;
$T['Image'] = "'".db_string($WikiImage)."'";
}
2013-04-20 08:01:01 +00:00
if (strlen($WikiBody) > strlen($Body)) {
2011-03-28 14:21:28 +00:00
$Body = $WikiBody;
2013-04-15 08:00:54 +00:00
if (!$Properties['Image'] || $Properties['Image'] == $WikiImage) {
2011-03-28 14:21:28 +00:00
$NoRevision = true;
}
}
2012-10-11 08:00:15 +00:00
$ArtistForm = Artists::get_artist($GroupID);
2011-03-28 14:21:28 +00:00
//This torrent belongs in a group
break;
} else {
2013-05-23 08:01:12 +00:00
// The album hasn't been uploaded. Try to get the artist IDs
2011-03-28 14:21:28 +00:00
$DB->query("
SELECT
2013-04-15 08:00:54 +00:00
aa.ArtistID,
aa.AliasID,
aa.Name,
aa.Redirect
2011-03-28 14:21:28 +00:00
FROM artists_alias AS aa
2012-06-02 08:00:16 +00:00
WHERE aa.Name = '".db_string($Artist['name'])."'");
2013-07-10 00:08:53 +00:00
if ($DB->has_results()) {
2013-04-15 08:00:54 +00:00
while (list($ArtistID, $AliasID, $AliasName, $Redirect) = $DB->next_record(MYSQLI_NUM, false)) {
if (!strcasecmp($Artist['name'], $AliasName)) {
if ($Redirect) {
2012-05-18 13:35:17 +00:00
$AliasID = $Redirect;
}
2012-06-13 08:00:16 +00:00
$ArtistForm[$Importance][$Num] = array('id' => $ArtistID, 'aliasid' => $AliasID, 'name' => $AliasName);
2012-05-18 13:35:17 +00:00
break;
}
2011-03-28 14:21:28 +00:00
}
}
}
}
}
}
}
//Needs to be here as it isn't set for add format until now
$LogName .= $Properties['Title'];
//For notifications--take note now whether it's a new group
$IsNewGroup = !$GroupID;
//----- Start inserts
2013-04-15 08:00:54 +00:00
if (!$GroupID && $Type == 'Music') {
2013-03-01 08:00:40 +00:00
//array to store which artists we have added already, to prevent adding an artist twice
$ArtistsAdded = array();
2013-04-15 08:00:54 +00:00
foreach ($ArtistForm as $Importance => $Artists) {
foreach ($Artists as $Num => $Artist) {
if (!$Artist['id']) {
if (isset($ArtistsAdded[strtolower($Artist['name'])])) {
2013-03-01 08:00:40 +00:00
$ArtistForm[$Importance][$Num] = $ArtistsAdded[strtolower($Artist['name'])];
} else {
// Create artist
2013-05-23 08:01:12 +00:00
$DB->query("
INSERT INTO artists_group (Name)
VALUES ('".db_string($Artist['name'])."')");
2013-03-01 08:00:40 +00:00
$ArtistID = $DB->inserted_id();
2011-03-28 14:21:28 +00:00
2013-03-01 08:00:40 +00:00
$Cache->increment('stats_artist_count');
2011-03-28 14:21:28 +00:00
2013-05-23 08:01:12 +00:00
$DB->query("
INSERT INTO artists_alias (ArtistID, Name)
VALUES ($ArtistID, '".db_string($Artist['name'])."')");
2013-03-01 08:00:40 +00:00
$AliasID = $DB->inserted_id();
2011-03-28 14:21:28 +00:00
2013-03-01 08:00:40 +00:00
$ArtistForm[$Importance][$Num] = array('id' => $ArtistID, 'aliasid' => $AliasID, 'name' => $Artist['name']);
$ArtistsAdded[strtolower($Artist['name'])] = $ArtistForm[$Importance][$Num];
}
2011-03-28 14:21:28 +00:00
}
}
}
2013-03-01 08:00:40 +00:00
unset($ArtistsAdded);
2011-03-28 14:21:28 +00:00
}
2013-04-15 08:00:54 +00:00
if (!$GroupID) {
2011-03-28 14:21:28 +00:00
// Create torrent group
$DB->query("
INSERT INTO torrents_group
2013-05-23 08:01:12 +00:00
(ArtistID, CategoryID, Name, Year, RecordLabel, CatalogueNumber, Time, WikiBody, WikiImage, SearchText, ReleaseType, VanityHouse)
VALUES
(0, $TypeID, ".$T['Title'].", $T[Year], $T[RecordLabel], $T[CatalogueNumber], '".sqltime()."', '".db_string($Body)."', $T[Image], '$SearchText', $T[ReleaseType], $T[VanityHouse])");
2011-03-28 14:21:28 +00:00
$GroupID = $DB->inserted_id();
2013-04-15 08:00:54 +00:00
if ($Type == 'Music') {
foreach ($ArtistForm as $Importance => $Artists) {
foreach ($Artists as $Num => $Artist) {
2013-05-23 08:01:12 +00:00
$DB->query("
INSERT IGNORE INTO torrents_artists (GroupID, ArtistID, AliasID, UserID, Importance)
2013-07-04 08:00:56 +00:00
VALUES ($GroupID, ".$Artist['id'].', '.$Artist['aliasid'].', '.$LoggedUser['ID'].", '$Importance')");
2011-03-28 14:21:28 +00:00
$Cache->increment('stats_album_count');
}
}
}
$Cache->increment('stats_group_count');
} else {
2013-05-23 08:01:12 +00:00
$DB->query("
UPDATE torrents_group
2013-07-04 08:00:56 +00:00
SET Time = '".sqltime()."'
WHERE ID = $GroupID");
$Cache->delete_value("torrent_group_$GroupID");
$Cache->delete_value("torrents_details_$GroupID");
$Cache->delete_value("detail_files_$GroupID");
2013-04-15 08:00:54 +00:00
if ($Type == 'Music') {
2013-07-04 08:00:56 +00:00
$DB->query("
SELECT ReleaseType
FROM torrents_group
WHERE ID = '$GroupID'");
2012-02-22 08:00:31 +00:00
list($Properties['ReleaseType']) = $DB->next_record();
}
2011-03-28 14:21:28 +00:00
}
// Description
2013-04-15 08:00:54 +00:00
if (!$NoRevision) {
2011-03-28 14:21:28 +00:00
$DB->query("
INSERT INTO wiki_torrents
2013-05-23 08:01:12 +00:00
(PageID, Body, UserID, Summary, Time, Image)
VALUES
($GroupID, $T[GroupDescription], $LoggedUser[ID], 'Uploaded new torrent', '".sqltime()."', $T[Image])");
2011-03-28 14:21:28 +00:00
$RevisionID = $DB->inserted_id();
// Revision ID
2013-05-23 08:01:12 +00:00
$DB->query("
UPDATE torrents_group
2013-07-04 08:00:56 +00:00
SET RevisionID = '$RevisionID'
WHERE ID = $GroupID");
2011-03-28 14:21:28 +00:00
}
// Tags
$Tags = explode(',', $Properties['TagList']);
2013-04-15 08:00:54 +00:00
if (!$Properties['GroupID']) {
foreach ($Tags as $Tag) {
2012-10-11 08:00:15 +00:00
$Tag = Misc::sanitize_tag($Tag);
2013-04-15 08:00:54 +00:00
if (!empty($Tag)) {
2012-10-11 08:00:15 +00:00
$Tag = Misc::get_alias_tag($Tag);
2013-05-23 08:01:12 +00:00
$DB->query("
INSERT INTO tags
(Name, UserID)
VALUES
('$Tag', $LoggedUser[ID])
2013-07-04 08:00:56 +00:00
ON DUPLICATE KEY UPDATE Uses = Uses + 1;
2011-03-28 14:21:28 +00:00
");
$TagID = $DB->inserted_id();
2013-05-23 08:01:12 +00:00
$DB->query("
INSERT INTO torrents_tags
(TagID, GroupID, UserID, PositiveVotes)
VALUES
($TagID, $GroupID, $LoggedUser[ID], 10)
2013-07-04 08:00:56 +00:00
ON DUPLICATE KEY UPDATE PositiveVotes = PositiveVotes + 1;
2011-03-28 14:21:28 +00:00
");
}
}
}
// Use this section to control freeleeches
2012-12-26 08:00:54 +00:00
$T['FreeLeech'] = 0;
$T['FreeLeechType'] = 0;
2013-02-25 21:16:55 +00:00
$LogScore = ($HasLog == 1 ? $LogScoreAverage : 0);
2011-03-28 14:21:28 +00:00
// Torrent
$DB->query("
INSERT INTO torrents
2013-02-22 08:00:24 +00:00
(GroupID, UserID, Media, Format, Encoding,
Remastered, RemasterYear, RemasterTitle, RemasterRecordLabel, RemasterCatalogueNumber,
2013-07-04 08:00:56 +00:00
Scene, HasLog, HasCue, info_hash, FileCount, FileList, FilePath,
Size, Time, Description, LogScore, FreeTorrent, FreeLeechType)
2011-03-28 14:21:28 +00:00
VALUES
2013-07-05 08:00:39 +00:00
($GroupID, $LoggedUser[ID], $T[Media], $T[Format], $T[Encoding],
$T[Remastered], $T[RemasterYear], $T[RemasterTitle], $T[RemasterRecordLabel], $T[RemasterCatalogueNumber],
$T[Scene], '$HasLog', '$HasCue', '".db_string($InfoHash)."', $NumFiles, '$FileString', '$FilePath',
$TotalSize, '".sqltime()."', $T[TorrentDescription], $LogScore, '$T[FreeLeech]', '$T[FreeLeechType]')");
2011-03-28 14:21:28 +00:00
$Cache->increment('stats_torrent_count');
$TorrentID = $DB->inserted_id();
2012-10-11 08:00:15 +00:00
Tracker::update_tracker('add_torrent', array('id' => $TorrentID, 'info_hash' => rawurlencode($InfoHash), 'freetorrent' => $T['FreeLeech']));
2013-02-17 08:00:08 +00:00
$Debug->set_flag('upload: ocelot updated');
2011-03-28 14:21:28 +00:00
2013-06-27 08:01:06 +00:00
// Prevent deletion of this torrent until the rest of the upload process is done
// (expire the key after 10 minutes to prevent locking it for too long in case there's a fatal error below)
2013-07-04 08:00:56 +00:00
$Cache->cache_value("torrent_{$TorrentID}_lock", true, 600);
2013-06-27 08:01:06 +00:00
2011-03-28 14:21:28 +00:00
//******************************************************************************//
//--------------- Write torrent file -------------------------------------------//
2013-05-23 08:01:12 +00:00
$DB->query("
INSERT INTO torrents_files (TorrentID, File)
VALUES ($TorrentID, '$TorEnc')");
2013-07-04 08:00:56 +00:00
Misc::write_log("Torrent $TorrentID ($LogName) (".number_format($TotalSize / (1024 * 1024), 2).' MB) was uploaded by ' . $LoggedUser['Username']);
2013-05-23 08:01:12 +00:00
Torrents::write_group_log($GroupID, $TorrentID, $LoggedUser['ID'], 'uploaded ('.number_format($TotalSize / (1024 * 1024), 2).' MB)', 0);
2011-03-28 14:21:28 +00:00
2012-10-11 08:00:15 +00:00
Torrents::update_hash($GroupID);
2013-02-25 21:16:55 +00:00
$Debug->set_flag('upload: sphinx updated');
2011-03-28 14:21:28 +00:00
2013-04-15 08:00:54 +00:00
if ($Type == 'Music') {
2012-11-14 08:00:19 +00:00
include(SERVER_ROOT.'/sections/upload/insert_extra_torrents.php');
}
2011-03-28 14:21:28 +00:00
//******************************************************************************//
//--------------- Add the log scores to the DB ---------------------------------//
if (!empty($LogScores) && $HasLog) {
2013-05-23 08:01:12 +00:00
$LogQuery = '
2013-07-10 00:08:53 +00:00
INSERT INTO torrents_logs_new
(TorrentID, Log, Details, NotEnglish, Score, Revision, Adjusted, AdjustedBy, AdjustmentReason)
2013-05-23 08:01:12 +00:00
VALUES (';
2013-02-22 08:00:24 +00:00
foreach ($LogScores as $LogKey => $LogScore) {
2013-05-23 08:01:12 +00:00
$LogScores[$LogKey] = "$TorrentID, $LogScore, 1, 0, 0, NULL";
2011-03-28 14:21:28 +00:00
}
$LogQuery .= implode('),(', $LogScores).')';
$DB->query($LogQuery);
$LogInDB = true;
2012-10-02 08:00:20 +00:00
}
2011-03-28 14:21:28 +00:00
//******************************************************************************//
//--------------- Stupid Recent Uploads ----------------------------------------//
2013-04-15 08:00:54 +00:00
if (trim($Properties['Image']) != '') {
2013-07-05 08:00:39 +00:00
$RecentUploads = $Cache->get_value("recent_uploads_$UserID");
2013-04-15 08:00:54 +00:00
if (is_array($RecentUploads)) {
2011-03-28 14:21:28 +00:00
do {
2013-04-15 08:00:54 +00:00
foreach ($RecentUploads as $Item) {
if ($Item['ID'] == $GroupID) {
break 2;
}
2011-03-28 14:21:28 +00:00
}
// Only reached if no matching GroupIDs in the cache already.
2013-07-10 00:08:53 +00:00
if (count($RecentUploads) === 5) {
2011-03-28 14:21:28 +00:00
array_pop($RecentUploads);
}
2013-07-10 00:08:53 +00:00
array_unshift($RecentUploads, array(
'ID' => $GroupID,
'Name' => trim($Properties['Title']),
'Artist' => Artists::display_artists($ArtistForm, false, true),
'WikiImage' => trim($Properties['Image'])));
2013-07-04 08:00:56 +00:00
$Cache->cache_value("recent_uploads_$UserID", $RecentUploads, 0);
2011-03-28 14:21:28 +00:00
} while (0);
}
}
2012-03-08 08:00:24 +00:00
//******************************************************************************//
//--------------- Contest ------------------------------------------------------//
2013-04-15 08:00:54 +00:00
if ($Properties['LibraryImage'] != '') {
2013-05-23 08:01:12 +00:00
$DB->query("
2013-07-04 08:00:56 +00:00
INSERT INTO reportsv2
(ReporterID, TorrentID, Type, UserComment, Status, ReportedTime, Track, Image, ExtraID, Link)
VALUES
(0, $TorrentID, 'library', '".db_string(($Properties['MultiDisc'] ? 'Multi-disc' : ''))."', 'New', '".sqltime()."', '', '".db_string($Properties['LibraryImage'])."', '', '')");
2012-03-08 08:00:24 +00:00
}
2013-02-25 21:16:55 +00:00
//******************************************************************************//
//--------------- Post-processing ----------------------------------------------//
/* Because tracker updates and notifications can be slow, we're
* redirecting the user to the destination page and flushing the buffers
* to make it seem like the PHP process is working in the background.
*/
if ($PublicTorrent) {
2013-05-23 08:01:12 +00:00
View::show_header('Warning');
2013-02-25 21:16:55 +00:00
?>
<h1>Warning</h1>
<p><strong>Your torrent has been uploaded; however, you must download your torrent from <a href="torrents.php?id=<?=$GroupID?>">here</a> because you didn't make your torrent using the "private" option.</strong></p>
<?
View::show_footer();
2013-04-15 08:00:54 +00:00
} elseif ($RequestID) {
2013-05-23 08:01:12 +00:00
header("Location: requests.php?action=takefill&requestid=$RequestID&torrentid=$TorrentID&auth=".$LoggedUser['AuthKey']);
2013-02-25 21:16:55 +00:00
} else {
header("Location: torrents.php?id=$GroupID");
}
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
} else {
ignore_user_abort(true);
ob_flush();
flush();
ob_start(); // So we don't keep sending data to the client
}
2011-03-28 14:21:28 +00:00
//******************************************************************************//
//--------------- IRC announce and feeds ---------------------------------------//
2013-04-15 08:00:54 +00:00
$Announce = '';
2011-03-28 14:21:28 +00:00
2013-04-15 08:00:54 +00:00
if ($Type == 'Music') {
$Announce .= Artists::display_artists($ArtistForm, false);
}
2013-05-23 08:01:12 +00:00
$Announce .= trim($Properties['Title']).' ';
2013-04-15 08:00:54 +00:00
if ($Type == 'Music') {
2012-02-22 08:00:31 +00:00
$Announce .= '['.trim($Properties['Year']).']';
2013-04-15 08:00:54 +00:00
if (($Type == 'Music') && ($Properties['ReleaseType'] > 0)) {
$Announce .= ' ['.$ReleaseTypes[$Properties['ReleaseType']].']';
}
$Announce .= ' - ';
2013-07-04 08:00:56 +00:00
$Announce .= trim($Properties['Format']).' / '.trim($Properties['Bitrate']);
2013-04-15 08:00:54 +00:00
if ($HasLog == 1) {
$Announce .= ' / Log';
}
if ($LogInDB) {
$Announce .= ' / '.$LogScoreAverage.'%';
}
if ($HasCue == 1) {
$Announce .= ' / Cue';
}
$Announce .= ' / '.trim($Properties['Media']);
if ($Properties['Scene'] == '1') {
$Announce .= ' / Scene';
}
if ($T['FreeLeech'] == '1') {
$Announce .= ' / Freeleech!';
}
2011-03-28 14:21:28 +00:00
}
$Title = $Announce;
2013-07-04 08:00:56 +00:00
$AnnounceSSL = "$Announce - https://".SSL_SITE_URL."/torrents.php?id=$GroupID / https://".SSL_SITE_URL."/torrents.php?action=download&id=$TorrentID";
2012-09-20 08:00:49 +00:00
$Announce .= " - https://".SSL_SITE_URL."/torrents.php?id=$GroupID / https://".SSL_SITE_URL."/torrents.php?action=download&id=$TorrentID";
2011-03-28 14:21:28 +00:00
2013-05-23 08:01:12 +00:00
$AnnounceSSL .= ' - '.trim($Properties['TagList']);
$Announce .= ' - '.trim($Properties['TagList']);
2011-03-28 14:21:28 +00:00
2013-04-26 08:00:25 +00:00
// ENT_QUOTES is needed to decode single quotes/apostrophes
send_irc('PRIVMSG #'.NONSSL_SITE_URL.'-announce :'.html_entity_decode($Announce, ENT_QUOTES));
send_irc('PRIVMSG #'.NONSSL_SITE_URL.'-announce-ssl :'.html_entity_decode($AnnounceSSL, ENT_QUOTES));
2013-02-17 08:00:08 +00:00
$Debug->set_flag('upload: announced on irc');
2011-03-28 14:21:28 +00:00
// Manage notifications
$UsedFormatBitrates = array();
2013-04-15 08:00:54 +00:00
if (!$IsNewGroup) {
2011-03-28 14:21:28 +00:00
// maybe there are torrents in the same release as the new torrent. Let's find out (for notifications)
2013-02-04 08:00:13 +00:00
$GroupInfo = get_group_info($GroupID, true, 0, false);
2011-03-28 14:21:28 +00:00
$ThisMedia = display_str($Properties['Media']);
$ThisRemastered = display_str($Properties['Remastered']);
$ThisRemasterYear = display_str($Properties['RemasterYear']);
$ThisRemasterTitle = display_str($Properties['RemasterTitle']);
$ThisRemasterRecordLabel = display_str($Properties['RemasterRecordLabel']);
$ThisRemasterCatalogueNumber = display_str($Properties['RemasterCatalogueNumber']);
2013-04-15 08:00:54 +00:00
foreach ($GroupInfo[1] as $TorrentInfo) {
2011-03-28 14:21:28 +00:00
if (($TorrentInfo['Media'] == $ThisMedia)
2013-02-07 08:00:47 +00:00
&& ($TorrentInfo['Remastered'] == $ThisRemastered)
&& ($TorrentInfo['RemasterYear'] == (int)$ThisRemasterYear)
&& ($TorrentInfo['RemasterTitle'] == $ThisRemasterTitle)
&& ($TorrentInfo['RemasterRecordLabel'] == $ThisRemasterRecordLabel)
&& ($TorrentInfo['RemasterCatalogueNumber'] == $ThisRemasterCatalogueNumber)
&& ($TorrentInfo['ID'] != $TorrentID)) {
2011-03-28 14:21:28 +00:00
$UsedFormatBitrates[] = array('format' => $TorrentInfo['Format'], 'bitrate' => $TorrentInfo['Encoding']);
}
}
}
// For RSS
$Item = $Feed->item($Title, $Text->strip_bbcode($Body), 'torrents.php?action=download&amp;authkey=[[AUTHKEY]]&amp;torrent_pass=[[PASSKEY]]&amp;id='.$TorrentID, $LoggedUser['Username'], 'torrents.php?id='.$GroupID, trim($Properties['TagList']));
//Notifications
2013-05-23 08:01:12 +00:00
$SQL = "
SELECT unf.ID, unf.UserID, torrent_pass
2011-03-28 14:21:28 +00:00
FROM users_notify_filters AS unf
2013-07-04 08:00:56 +00:00
JOIN users_main AS um ON um.ID = unf.UserID
WHERE um.Enabled = '1'";
2013-04-15 08:00:54 +00:00
if (empty($ArtistsUnescaped)) {
2011-03-28 14:21:28 +00:00
$ArtistsUnescaped = $ArtistForm;
}
2013-04-15 08:00:54 +00:00
if (!empty($ArtistsUnescaped)) {
2011-03-28 14:21:28 +00:00
$ArtistNameList = array();
$GuestArtistNameList = array();
2013-04-15 08:00:54 +00:00
foreach ($ArtistsUnescaped as $Importance => $Artists) {
foreach ($Artists as $Artist) {
if ($Importance == 1 || $Importance == 4 || $Importance == 5 || $Importance == 6) {
2013-07-04 08:00:56 +00:00
$ArtistNameList[] = "Artists LIKE '%|".db_string(str_replace('\\', '\\\\', $Artist['name']), true)."|%'";
2011-03-28 14:21:28 +00:00
} else {
2013-07-04 08:00:56 +00:00
$GuestArtistNameList[] = "Artists LIKE '%|".db_string(str_replace('\\', '\\\\', $Artist['name']), true)."|%'";
2011-03-28 14:21:28 +00:00
}
}
}
// Don't add notification if >2 main artists or if tracked artist isn't a main artist
2013-04-15 08:00:54 +00:00
if (count($ArtistNameList) > 2 || $Artist['name'] == 'Various Artists') {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (ExcludeVA = '0' AND (";
$SQL .= implode(' OR ', array_merge($ArtistNameList, $GuestArtistNameList));
$SQL .= " OR Artists = '')) AND (";
2011-03-28 14:21:28 +00:00
} else {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (";
2013-04-15 08:00:54 +00:00
if (!empty($GuestArtistNameList)) {
2013-07-04 08:00:56 +00:00
$SQL .= "(ExcludeVA = '0' AND (";
$SQL .= implode(' OR ', $GuestArtistNameList);
$SQL .= ')) OR ';
2011-03-28 14:21:28 +00:00
}
2013-07-04 08:00:56 +00:00
$SQL .= implode(' OR ', $ArtistNameList);
$SQL .= " OR Artists = '') AND (";
2011-03-28 14:21:28 +00:00
}
} else {
2013-07-04 08:00:56 +00:00
$SQL .= "AND (Artists = '') AND (";
2011-03-28 14:21:28 +00:00
}
reset($Tags);
$TagSQL = array();
$NotTagSQL = array();
2013-04-15 08:00:54 +00:00
foreach ($Tags as $Tag) {
2013-07-04 08:00:56 +00:00
$TagSQL[] = " Tags LIKE '%|".db_string(trim($Tag))."|%' ";
$NotTagSQL[] = " NotTags LIKE '%|".db_string(trim($Tag))."|%' ";
2011-03-28 14:21:28 +00:00
}
2013-07-04 08:00:56 +00:00
$TagSQL[] = "Tags = ''";
$SQL .= implode(' OR ', $TagSQL);
2011-03-28 14:21:28 +00:00
2013-07-04 08:00:56 +00:00
$SQL .= ") AND !(".implode(' OR ', $NotTagSQL).')';
2011-03-28 14:21:28 +00:00
2013-07-04 08:00:56 +00:00
$SQL .= " AND (Categories LIKE '%|".db_string(trim($Type))."|%' OR Categories = '') ";
2011-03-28 14:21:28 +00:00
2013-04-15 08:00:54 +00:00
if ($Properties['ReleaseType']) {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (ReleaseTypes LIKE '%|".db_string(trim($ReleaseTypes[$Properties['ReleaseType']]))."|%' OR ReleaseTypes = '') ";
2011-03-28 14:21:28 +00:00
} else {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (ReleaseTypes = '') ";
2011-03-28 14:21:28 +00:00
}
/*
Notify based on the following:
1. The torrent must match the formatbitrate filter on the notification
2. If they set NewGroupsOnly to 1, it must also be the first torrent in the group to match the formatbitrate filter on the notification
*/
2013-04-15 08:00:54 +00:00
if ($Properties['Format']) {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (Formats LIKE '%|".db_string(trim($Properties['Format']))."|%' OR Formats = '') ";
2011-03-28 14:21:28 +00:00
} else {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (Formats = '') ";
2011-03-28 14:21:28 +00:00
}
2013-04-15 08:00:54 +00:00
if ($_POST['bitrate']) {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (Encodings LIKE '%|".db_string(trim($_POST['bitrate']))."|%' OR Encodings = '') ";
2011-03-28 14:21:28 +00:00
} else {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (Encodings = '') ";
2011-03-28 14:21:28 +00:00
}
2013-04-15 08:00:54 +00:00
if ($Properties['Media']) {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (Media LIKE '%|".db_string(trim($Properties['Media']))."|%' OR Media = '') ";
2011-03-28 14:21:28 +00:00
} else {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (Media = '') ";
2011-03-28 14:21:28 +00:00
}
// Either they aren't using NewGroupsOnly
$SQL .= "AND ((NewGroupsOnly = '0' ";
// Or this is the first torrent in the group to match the formatbitrate filter
$SQL .= ") OR ( NewGroupsOnly = '1' ";
// Test the filter doesn't match any previous formatbitrate in the group
foreach ($UsedFormatBitrates as $UsedFormatBitrate) {
$FormatReq = "(Formats LIKE '%|".db_string($UsedFormatBitrate['format'])."|%' OR Formats = '') ";
$BitrateReq = "(Encodings LIKE '%|".db_string($UsedFormatBitrate['bitrate'])."|%' OR Encodings = '') ";
$SQL .= "AND (NOT($FormatReq AND $BitrateReq)) ";
}
2013-02-22 08:00:24 +00:00
2013-04-15 08:00:54 +00:00
$SQL .= '))';
2011-03-28 14:21:28 +00:00
2013-04-15 08:00:54 +00:00
if ($Properties['Year'] && $Properties['RemasterYear']) {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (('".db_string(trim($Properties['Year']))."' BETWEEN FromYear AND ToYear)
2011-03-28 14:21:28 +00:00
OR ('".db_string(trim($Properties['RemasterYear']))."' BETWEEN FromYear AND ToYear)
2013-07-04 08:00:56 +00:00
OR (FromYear = 0 AND ToYear = 0)) ";
2013-04-15 08:00:54 +00:00
} elseif ($Properties['Year'] || $Properties['RemasterYear']) {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (('".db_string(trim(Max($Properties['Year'],$Properties['RemasterYear'])))."' BETWEEN FromYear AND ToYear)
OR (FromYear = 0 AND ToYear = 0)) ";
2011-03-28 14:21:28 +00:00
} else {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (FromYear = 0 AND ToYear = 0) ";
2011-03-28 14:21:28 +00:00
}
2013-07-04 08:00:56 +00:00
$SQL .= " AND UserID != '".$LoggedUser['ID']."' ";
2011-03-28 14:21:28 +00:00
2013-07-04 08:00:56 +00:00
$DB->query("
SELECT Paranoia
FROM users_main
WHERE ID = $LoggedUser[ID]");
2013-05-23 08:01:12 +00:00
list($Paranoia) = $DB->next_record();
$Paranoia = unserialize($Paranoia);
if (!is_array($Paranoia)) {
$Paranoia = array();
}
2013-05-26 08:00:59 +00:00
if (!in_array('notifications', $Paranoia)) {
2013-07-04 08:00:56 +00:00
$SQL .= " AND (Users LIKE '%|".$LoggedUser['ID']."|%' OR Users = '') ";
2013-05-23 08:01:12 +00:00
}
2013-07-04 08:00:56 +00:00
$SQL .= " AND UserID != '".$LoggedUser['ID']."' ";
2011-03-28 14:21:28 +00:00
$DB->query($SQL);
2013-02-17 08:00:08 +00:00
$Debug->set_flag('upload: notification query finished');
2011-03-28 14:21:28 +00:00
2013-07-10 00:08:53 +00:00
if ($DB->has_results()) {
2011-03-28 14:21:28 +00:00
$UserArray = $DB->to_array('UserID');
$FilterArray = $DB->to_array('ID');
2013-05-23 08:01:12 +00:00
$InsertSQL = '
INSERT IGNORE INTO users_notify_torrents (UserID, GroupID, TorrentID, FilterID)
VALUES ';
2011-03-28 14:21:28 +00:00
$Rows = array();
foreach ($UserArray as $User) {
list($FilterID, $UserID, $Passkey) = $User;
2013-07-04 08:00:56 +00:00
$Rows[] = "('$UserID', '$GroupID', '$TorrentID', '$FilterID')";
$Feed->populate("torrents_notify_$Passkey", $Item);
$Cache->delete_value("notifications_new_$UserID");
2011-03-28 14:21:28 +00:00
}
2013-07-04 08:00:56 +00:00
$InsertSQL .= implode(',', $Rows);
2011-03-28 14:21:28 +00:00
$DB->query($InsertSQL);
2013-02-17 08:00:08 +00:00
$Debug->set_flag('upload: notification inserts finished');
2011-03-28 14:21:28 +00:00
foreach ($FilterArray as $Filter) {
list($FilterID, $UserID, $Passkey) = $Filter;
2013-07-04 08:00:56 +00:00
$Feed->populate("torrents_notify_{$FilterID}_$Passkey", $Item);
2011-03-28 14:21:28 +00:00
}
}
2012-02-08 08:00:20 +00:00
// RSS for bookmarks
2013-05-23 08:01:12 +00:00
$DB->query("
SELECT u.ID, u.torrent_pass
FROM users_main AS u
JOIN bookmarks_torrents AS b ON b.UserID = u.ID
WHERE b.GroupID = $GroupID");
2012-02-08 08:00:20 +00:00
while (list($UserID, $Passkey) = $DB->next_record()) {
2013-07-04 08:00:56 +00:00
$Feed->populate("torrents_bookmarks_t_$Passkey", $Item);
2012-02-08 08:00:20 +00:00
}
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_all', $Item);
2013-02-17 08:00:08 +00:00
$Debug->set_flag('upload: notifications handled');
2013-04-20 08:01:01 +00:00
if ($Type == 'Music') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_music', $Item);
2013-04-15 08:00:54 +00:00
if ($Properties['Media'] == 'Vinyl') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_vinyl', $Item);
2013-04-15 08:00:54 +00:00
}
if ($Properties['Bitrate'] == 'Lossless') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_lossless', $Item);
2013-04-15 08:00:54 +00:00
}
if ($Properties['Bitrate'] == '24bit Lossless') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_lossless24', $Item);
2013-04-15 08:00:54 +00:00
}
if ($Properties['Format'] == 'MP3') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_mp3', $Item);
2013-04-15 08:00:54 +00:00
}
if ($Properties['Format'] == 'FLAC') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_flac', $Item);
2013-04-15 08:00:54 +00:00
}
}
if ($Type == 'Applications') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_apps', $Item);
2013-04-15 08:00:54 +00:00
}
if ($Type == 'E-Books') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_ebooks', $Item);
2013-04-15 08:00:54 +00:00
}
if ($Type == 'Audiobooks') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_abooks', $Item);
2013-04-15 08:00:54 +00:00
}
if ($Type == 'E-Learning Videos') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_evids', $Item);
2013-04-15 08:00:54 +00:00
}
if ($Type == 'Comedy') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_comedy', $Item);
2013-04-15 08:00:54 +00:00
}
if ($Type == 'Comics') {
2013-07-04 08:00:56 +00:00
$Feed->populate('torrents_comics', $Item);
2013-04-15 08:00:54 +00:00
}
2011-03-28 14:21:28 +00:00
2013-07-04 08:00:56 +00:00
// Clear cache
$Cache->delete_value("torrents_details_$GroupID");
2013-06-27 08:01:06 +00:00
// Allow deletion of this torrent now
2013-07-04 08:00:56 +00:00
$Cache->delete_value("torrent_{$TorrentID}_lock");