Completed
Push — vendor/getid3 ( 69b815...49c253 )
by Pauli
04:26 queued 01:37
created

getid3_write_id3v1::WriteID3v1()   C

Complexity

Conditions 17
Paths 7

Size

Total Lines 37

Duplication

Lines 4
Ratio 10.81 %

Importance

Changes 0
Metric Value
cc 17
nc 7
nop 0
dl 4
loc 37
rs 5.2166
c 0
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/////////////////////////////////////////////////////////////////
4
/// getID3() by James Heinrich <[email protected]>               //
5
//  available at https://github.com/JamesHeinrich/getID3       //
6
//            or https://www.getid3.org                        //
7
//            or http://getid3.sourceforge.net                 //
8
//  see readme.txt for more details                            //
9
/////////////////////////////////////////////////////////////////
10
//                                                             //
11
// write.id3v1.php                                             //
12
// module for writing ID3v1 tags                               //
13
// dependencies: module.tag.id3v1.php                          //
14
//                                                            ///
15
/////////////////////////////////////////////////////////////////
16
17
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
18
19
class getid3_write_id3v1
20
{
21
	/**
22
	 * @var string
23
	 */
24
	public $filename;
25
26
	/**
27
	 * @var int
28
	 */
29
	public $filesize;
30
31
	/**
32
	 * @var array
33
	 */
34
	public $tag_data;
35
36
	/**
37
	 * Any non-critical errors will be stored here.
38
	 *
39
	 * @var array
40
	 */
41
	public $warnings = array();
42
43
	/**
44
	 * Any critical errors will be stored here.
45
	 *
46
	 * @var array
47
	 */
48
	public $errors   = array();
49
50
	public function __construct() {
51
	}
52
53
	/**
54
	 * @return bool
55
	 */
56
	public function WriteID3v1() {
57
		// File MUST be writeable - CHMOD(646) at least
58
		if (!empty($this->filename) && is_readable($this->filename) && getID3::is_writable($this->filename) && is_file($this->filename)) {
59
			$this->setRealFileSize();
60 View Code Duplication
			if (($this->filesize <= 0) || !getid3_lib::intValueSupported($this->filesize)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
61
				$this->errors[] = 'Unable to WriteID3v1('.$this->filename.') because filesize ('.$this->filesize.') is larger than '.round(PHP_INT_MAX / 1073741824).'GB';
62
				return false;
63
			}
64
			if ($fp_source = fopen($this->filename, 'r+b')) {
65
				fseek($fp_source, -128, SEEK_END);
66
				if (fread($fp_source, 3) == 'TAG') {
67
					fseek($fp_source, -128, SEEK_END); // overwrite existing ID3v1 tag
68
				} else {
69
					fseek($fp_source, 0, SEEK_END);    // append new ID3v1 tag
70
				}
71
				$this->tag_data['track_number'] = (isset($this->tag_data['track_number']) ? $this->tag_data['track_number'] : '');
72
73
				$new_id3v1_tag_data = getid3_id3v1::GenerateID3v1Tag(
74
														(isset($this->tag_data['title']       ) ? $this->tag_data['title']        : ''),
75
														(isset($this->tag_data['artist']      ) ? $this->tag_data['artist']       : ''),
76
														(isset($this->tag_data['album']       ) ? $this->tag_data['album']        : ''),
77
														(isset($this->tag_data['year']        ) ? $this->tag_data['year']         : ''),
78
														(isset($this->tag_data['genreid']     ) ? $this->tag_data['genreid']      : ''),
79
														(isset($this->tag_data['comment']     ) ? $this->tag_data['comment']      : ''),
80
														(isset($this->tag_data['track_number']) ? $this->tag_data['track_number'] : ''));
81
				fwrite($fp_source, $new_id3v1_tag_data, 128);
82
				fclose($fp_source);
83
				return true;
84
85
			} else {
86
				$this->errors[] = 'Could not fopen('.$this->filename.', "r+b")';
87
				return false;
88
			}
89
		}
90
		$this->errors[] = 'File is not writeable: '.$this->filename;
91
		return false;
92
	}
93
94
	/**
95
	 * @return bool
96
	 */
97
	public function FixID3v1Padding() {
98
		// ID3v1 data is supposed to be padded with NULL characters, but some taggers incorrectly use spaces
99
		// This function rewrites the ID3v1 tag with correct padding
100
101
		// Initialize getID3 engine
102
		$getID3 = new getID3;
103
		$getID3->option_tag_id3v2  = false;
104
		$getID3->option_tag_apetag = false;
105
		$getID3->option_tags_html  = false;
106
		$getID3->option_extra_info = false;
107
		$getID3->option_tag_id3v1  = true;
108
		$ThisFileInfo = $getID3->analyze($this->filename);
109
		if (isset($ThisFileInfo['tags']['id3v1'])) {
110
			$id3v1data = array();
111
			foreach ($ThisFileInfo['tags']['id3v1'] as $key => $value) {
112
				$id3v1data[$key] = implode(',', $value);
113
			}
114
			$this->tag_data = $id3v1data;
115
			return $this->WriteID3v1();
116
		}
117
		return false;
118
	}
119
120
	/**
121
	 * @return bool
122
	 */
123
	public function RemoveID3v1() {
124
		// File MUST be writeable - CHMOD(646) at least
125
		if (!empty($this->filename) && is_readable($this->filename) && getID3::is_writable($this->filename) && is_file($this->filename)) {
126
			$this->setRealFileSize();
127 View Code Duplication
			if (($this->filesize <= 0) || !getid3_lib::intValueSupported($this->filesize)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
128
				$this->errors[] = 'Unable to RemoveID3v1('.$this->filename.') because filesize ('.$this->filesize.') is larger than '.round(PHP_INT_MAX / 1073741824).'GB';
129
				return false;
130
			}
131
			if ($fp_source = fopen($this->filename, 'r+b')) {
132
133
				fseek($fp_source, -128, SEEK_END);
134
				if (fread($fp_source, 3) == 'TAG') {
135
					ftruncate($fp_source, $this->filesize - 128);
136
				} else {
137
					// no ID3v1 tag to begin with - do nothing
138
				}
139
				fclose($fp_source);
140
				return true;
141
142
			} else {
143
				$this->errors[] = 'Could not fopen('.$this->filename.', "r+b")';
144
			}
145
		} else {
146
			$this->errors[] = $this->filename.' is not writeable';
147
		}
148
		return false;
149
	}
150
151
	/**
152
	 * @return bool
153
	 */
154
	public function setRealFileSize() {
155
		if (PHP_INT_MAX > 2147483647) {
156
			$this->filesize = filesize($this->filename);
157
			return true;
158
		}
159
		// 32-bit PHP will not return correct values for filesize() if file is >=2GB
160
		// but getID3->analyze() has workarounds to get actual filesize
161
		$getID3 = new getID3;
162
		$getID3->option_tag_id3v1  = false;
163
		$getID3->option_tag_id3v2  = false;
164
		$getID3->option_tag_apetag = false;
165
		$getID3->option_tags_html  = false;
166
		$getID3->option_extra_info = false;
167
		$ThisFileInfo = $getID3->analyze($this->filename);
168
		$this->filesize = $ThisFileInfo['filesize'];
169
		return true;
170
	}
171
172
}
173