function WriteID3v2($filename, $data, $majorversion = 4, $minorversion = 0, $overwrite = FALSE, $paddedlength = 0, $showerrors = FALSE)
{
    // File MUST be writeable - CHMOD(646) at least. It's best if the
    // directory is also writeable, because that method is both faster and less susceptible to errors.
    if (is_writeable($filename) || !file_exists($filename) && is_writeable(dirname($filename))) {
        $OldMP3fileInfo = GetAllMP3info($filename);
        if ($overwrite) {
            // ignore previous data
        } else {
            // merge with existing data
            $data = array_join_merge($OldMP3fileInfo, $data);
            $paddedlength = max($OldMP3fileInfo['id3']['id3v2']['headerlength'], $paddedlength);
        }
        if ($NewID3v2Tag = GenerateID3v2Tag($data['id3']['id3v2'], $majorversion, $minorversion, $paddedlength, '', FALSE, $showerrors, TRUE)) {
            if (!file_exists($filename) && is_writeable(dirname($filename)) || is_writeable($filename) && $OldMP3fileInfo['id3']['id3v2']['headerlength'] == strlen($NewID3v2Tag)) {
                // best and fastest method - insert-overwrite existing tag (padded to length of old tag if neccesary)
                if (file_exists($filename)) {
                    if ($fp = @fopen($filename, 'r+b')) {
                        rewind($fp);
                        fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag));
                        fclose($fp);
                    } else {
                        $error .= 'Could not open ' . $filename . ' mode "r+b"<BR>';
                    }
                } else {
                    if ($fp = @fopen($filename, 'wb')) {
                        rewind($fp);
                        fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag));
                        fclose($fp);
                    } else {
                        $error .= 'Could not open ' . $filename . ' mode "wb"<BR>';
                    }
                }
            } else {
                // new tag is longer than old tag - must rewrite entire file
                if (is_writeable(dirname($filename))) {
                    // preferred alternate method - only one copying operation, minimal chance of corrupting
                    // original file if script is interrupted, but required directory to be writeable
                    if ($OldMP3fileInfo['audiobytes'] > 0) {
                        if ($fp_source = @fopen($filename, 'rb')) {
                            rewind($fp_source);
                            if ($OldMP3fileInfo['audiodataoffset'] !== FALSE) {
                                fseek($fp_source, $OldMP3fileInfo['audiodataoffset'], SEEK_SET);
                            }
                            if ($fp_temp = @fopen($filename . 'getid3tmp', 'wb')) {
                                fwrite($fp_temp, $NewID3v2Tag, strlen($NewID3v2Tag));
                                // while (($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) !== FALSE) {
                                while ($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) {
                                    fwrite($fp_temp, $buffer, strlen($buffer));
                                }
                                fclose($fp_temp);
                            } else {
                                $error .= 'Could not open ' . $filename . 'getid3tmp mode "wb"<BR>';
                            }
                            fclose($fp_source);
                        } else {
                            // no previous audiodata
                            if ($fp_temp = @fopen($filename . 'getid3tmp', 'wb')) {
                                fwrite($fp_temp, $NewID3v2Tag, strlen($NewID3v2Tag));
                                fclose($fp_temp);
                            }
                        }
                    } else {
                        $error .= 'Could not open ' . $filename . ' mode "rb"<BR>';
                    }
                    if (file_exists($filename)) {
                        unlink($filename);
                    }
                    rename($filename . 'getid3tmp', $filename);
                } else {
                    // less desirable alternate method - double-copies the file, overwrites original file
                    // and could corrupt source file if the script is interrupted or an error occurs.
                    if ($fp_source = @fopen($filename, 'rb')) {
                        rewind($fp_source);
                        if ($OldMP3fileInfo['audiodataoffset'] !== FALSE) {
                            fseek($fp_source, $OldMP3fileInfo['audiodataoffset'], SEEK_SET);
                        }
                        if ($fp_temp = tmpfile()) {
                            fwrite($fp_temp, $NewID3v2Tag, strlen($NewID3v2Tag));
                            // while (($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) !== FALSE) {
                            while ($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) {
                                fwrite($fp_temp, $buffer, strlen($buffer));
                            }
                            fclose($fp_source);
                            if ($fp_source = @fopen($filename, 'wb')) {
                                rewind($fp_temp);
                                // while (($buffer = fread($fp_temp, FREAD_BUFFER_SIZE)) !== FALSE) {
                                while ($buffer = fread($fp_temp, FREAD_BUFFER_SIZE)) {
                                    fwrite($fp_source, $buffer, strlen($buffer));
                                }
                                fseek($fp_temp, -128, SEEK_END);
                                fclose($fp_source);
                            } else {
                                $error .= 'Could not open ' . $filename . ' mode "wb"<BR>';
                            }
                            fclose($fp_temp);
                        } else {
                            $error .= 'Could not create tmpfile()<BR>';
                        }
                    } else {
                        $error .= 'Could not open ' . $filename . ' mode "rb"<BR>';
                    }
                }
            }
        } else {
            $error .= 'GenerateID3v2Tag() failed<BR>';
        }
        if ($error) {
            if ($showerrors) {
                echo $error;
            }
            return FALSE;
        } else {
            return TRUE;
        }
    } else {
        return FALSE;
    }
}
Example #2
0
function kpgenerateid3v2tag($sid)
{
    global $cfg, $phpenv, $setctl;
    if ($cfg['enablegetid3']) {
        $f2 = new file2($sid, true);
        switch (GETID3_V) {
            case 16:
                require_once GETID3_INCLUDEPATH . 'getid3.id3v2.php';
                $data['id3v2']['TIT2'][0]['encodingid'] = 0;
                $data['id3v2']['TIT2'][0]['data'] = $f2->id3['title'];
                $data['id3v2']['TPE1'][0]['encodingid'] = 0;
                $data['id3v2']['TPE1'][0]['data'] = $f2->id3['artist'];
                $data['id3v2']['TALB'][0]['encodingid'] = 0;
                $data['id3v2']['TALB'][0]['data'] = $f2->id3['album'];
                $data['id3v2']['TRCK'][0]['encodingid'] = 0;
                $data['id3v2']['TRCK'][0]['data'] = $f2->id3['track'];
                $data['id3v2']['COM'][0]['encodingid'] = 0;
                $data['id3v2']['COM'][0]['data'] = $f2->id3['comment'];
                $data['id3v2']['TYER'][0]['encodingid'] = 0;
                $data['id3v2']['TYER'][0]['data'] = $f2->id3['year'];
                return GenerateID3v2Tag($data['id3v2'], 3, 0, 0, '', false, false, false);
                break;
            case 19:
            case 17:
                $tagformat = 'UTF-8';
                $major = 3;
                $getID3 = new getID3();
                $getID3->encoding = $tagformat;
                if (!defined('GETID3_INCLUDEPATH')) {
                    define('GETID3_INCLUDEPATH', dirname($cfg['getid3include']) . '/');
                }
                if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH . 'module.tag.id3v2.php', __FILE__, false) && getid3_lib::IncludeDependency(GETID3_INCLUDEPATH . 'write.php', __FILE__, false) && getid3_lib::IncludeDependency(GETID3_INCLUDEPATH . 'write.id3v2.php', __FILE__, false)) {
                    $tagwriter = new getid3_writetags();
                    $tagwriter->tagformats = array('id3v2.3');
                    $tagwriter->filename = $f2->fullpath;
                    if (GETID3_V == 17) {
                        $tagwriter->overwrite_tags = false;
                    }
                    $tagwriter->tag_encoding = $tagformat;
                    $tagwriter->remove_other_tags = false;
                    $TagData['title'][0] = $f2->id3['title'];
                    $TagData['artist'][0] = $f2->id3['artist'];
                    $TagData['album'][0] = $f2->id3['album'];
                    if (vernum($f2->id3['year']) != 0) {
                        $TagData['year'][0] = vernum($f2->id3['year']);
                    }
                    $TagData['comment'][0] = $f2->id3['comment'];
                    $TagData['track'][0] = vernum($f2->id3['track']);
                    if (empty($TagData['title'][0])) {
                        $TagData['title'][0] = $f2->fname;
                    }
                    if (empty($TagData['artist'][0])) {
                        $TagData['artist'][0] = 'Unknown';
                    }
                    if (empty($TagData['album'][0])) {
                        $exp = explode('/', dirname($f2->fullpath));
                        if (count($exp) > 1) {
                            $TagData['album'][0] = $exp[count($exp) - 1];
                        }
                    }
                    $ci = new coverinterface();
                    $ci->setartist($f2->id3['artist'], $f2->id3['album']);
                    $ci->setlocation($f2->drive, $f2->relativepath);
                    if ($ci->coverexists()) {
                        if ($cfg['id3v2albumresize']) {
                            $rs = true;
                        } else {
                            $rs = false;
                        }
                        $imgdata = $ci->getimagedata($rs);
                        if (strlen($imgdata) > 0) {
                            if ($cfg['maxtagimagesize'] == 0 || strlen($imgdata) <= $cfg['maxtagimagesize']) {
                                $TagData['attached_picture'][0]['data'] = $imgdata;
                                $TagData['attached_picture'][0]['picturetypeid'] = 3;
                                $TagData['attached_picture'][0]['encodingid'] = 0;
                                $TagData['attached_picture'][0]['description'] = 'ART';
                                $TagData['attached_picture'][0]['mime'] = 'image/jpeg';
                            }
                        }
                    }
                    $tagwriter->tag_data = $TagData;
                    $id3v2_writer = new getid3_write_id3v2();
                    $id3v2_writer->majorversion = $major;
                    $id3v2_writer->paddedlength = 0;
                    if (($id3v2_writer->tag_data = $tagwriter->FormatDataForID3v2($major)) !== false) {
                        return $id3v2_writer->GenerateID3v2Tag();
                    }
                }
                break;
        }
    }
    return '';
}
Example #3
0
function WriteID3v2($filename, $data, $majorversion = 3, $minorversion = 0, $overwrite = false, $paddedlength = 4096, $showerrors = true)
{
    // File MUST be writeable - CHMOD(646) at least. It's best if the
    // directory is also writeable, because that method is both faster and less susceptible to errors.
    $error = '';
    if (is_writeable($filename) || !file_exists($filename) && is_writeable(dirname($filename))) {
        $OldThisfileInfo = GetAllFileInfo($filename);
        if ($overwrite) {
            // ignore previous data
        } else {
            // merge with existing data
            $data = array_join_merge($OldThisfileInfo, $data);
            $paddedlength = max($OldThisfileInfo['id3v2']['headerlength'], $paddedlength);
        }
        if ($NewID3v2Tag = GenerateID3v2Tag($data['id3v2'], $majorversion, $minorversion, $paddedlength, '', false, $showerrors, true)) {
            if (!file_exists($filename) && is_writeable(dirname($filename)) || is_writeable($filename) && isset($OldThisfileInfo['id3v2']['headerlength']) && $OldThisfileInfo['id3v2']['headerlength'] == strlen($NewID3v2Tag)) {
                // best and fastest method - insert-overwrite existing tag (padded to length of old tag if neccesary)
                if (file_exists($filename)) {
                    ob_start();
                    if ($fp = fopen($filename, 'r+b')) {
                        rewind($fp);
                        fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag));
                        fclose($fp);
                    } else {
                        $error .= 'Could not open ' . $filename . ' mode "r+b" - ' . strip_tags(ob_get_contents()) . '<BR>';
                    }
                    ob_end_clean();
                } else {
                    ob_start();
                    if ($fp = fopen($filename, 'wb')) {
                        rewind($fp);
                        fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag));
                        fclose($fp);
                    } else {
                        $error .= 'Could not open ' . $filename . ' mode "wb" - ' . strip_tags(ob_get_contents()) . '<BR>';
                    }
                    ob_end_clean();
                }
            } else {
                if ($tempfilename = tempnam('/tmp', 'getID3')) {
                    ob_start();
                    if ($fp_source = fopen($filename, 'rb')) {
                        if ($fp_temp = fopen($tempfilename, 'wb')) {
                            fwrite($fp_temp, $NewID3v2Tag, strlen($NewID3v2Tag));
                            rewind($fp_source);
                            if (!empty($OldThisfileInfo['avdataoffset'])) {
                                fseek($fp_source, $OldThisfileInfo['avdataoffset'], SEEK_SET);
                            }
                            while ($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) {
                                fwrite($fp_temp, $buffer, strlen($buffer));
                            }
                            fclose($fp_temp);
                            fclose($fp_source);
                            copy($tempfilename, $filename);
                            unlink($tempfilename);
                            return true;
                        } else {
                            $error .= 'Could not open ' . $tempfilename . ' mode "wb" - ' . strip_tags(ob_get_contents()) . '<BR>';
                        }
                        fclose($fp_source);
                    } else {
                        $error .= 'Could not open ' . $filename . ' mode "rb" - ' . strip_tags(ob_get_contents()) . '<BR>';
                    }
                    ob_end_clean();
                }
                if ($error) {
                    if ($showerrors) {
                        echo $error;
                    }
                }
                return false;
            }
        } else {
            $error .= 'GenerateID3v2Tag() failed<BR>';
        }
        if ($error) {
            if ($showerrors) {
                echo $error;
            }
            return false;
        }
        return true;
    }
    return false;
}