Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.12 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "locale.h"
  4. #include "malloc.h"
  5. #include <string.h>
  6. #include <math.h>
  7.  
  8. /*
  9. file structure:
  10. ID3v2/file identifier "ID3"
  11. ID3v2 version $03 00
  12. ID3v2 flags %abc00000
  13. ID3v2 size 4 * %0xxxxxxx
  14.  
  15. Frame ID $xx xx xx xx (four characters)
  16. Size $xx xx xx xx
  17. Flags $xx xx
  18.  
  19. <Frame contents>
  20.  
  21. etc...
  22. */
  23.  
  24. int buffToIntegerForFrame(unsigned char *bytes) //char to integer size
  25. {
  26. return
  27. bytes[0] * pow(2, 24) + //2^21
  28. bytes[1] * pow(2, 16) + //2^14
  29. bytes[2] * pow(2, 8) + //2^7
  30. bytes[3];
  31. }
  32.  
  33. int buffToInteger(unsigned char *bytes) {
  34. return
  35. bytes[0] * 0x200000 + //2^21
  36. bytes[1] * 0x4000 + //2^14
  37. bytes[2] * 0x80 + //2^7
  38. bytes[3];
  39. }
  40.  
  41. void integerToBuff(int number, unsigned char *result) {
  42. result[0] = (unsigned char) ((number & 0xfe00000) >> 21); //0100000
  43. result[1] = (unsigned char) ((number & 0x1fc000) >> 14); //0010010
  44. result[2] = (unsigned char) ((number & 0x3f80) >> 7); //0000001
  45. result[3] = (unsigned char) (number & 0x7f); //0000100
  46. }
  47.  
  48. void integerToBuffForFrame(int number, unsigned char *result) {
  49. result[0] = (unsigned char) ((number & 0xff000000) >> 24); //0100000
  50. result[1] = (unsigned char) ((number & 0xff0000) >> 16); //0010010
  51. result[2] = (unsigned char) ((number & 0xff00) >> 8); //0000001
  52. result[3] = (unsigned char) (number & 0xff); //0000100
  53. }
  54.  
  55. struct tagHeader {
  56. unsigned char name[3]; //ID3
  57. unsigned char version[2]; //2 bytes ex. 3 0
  58. unsigned char flags; //1 byte
  59. unsigned int framesCount;
  60. unsigned int size; //4 bytes for tagHeader`s size
  61. };
  62. struct oframe {
  63. unsigned char name[4];//4 bytes FRAME NAME ex. TIT2, TALB and etc.
  64. unsigned char flags[2]; //2 bytes
  65. unsigned int size; //4 FRAME`S size
  66. unsigned char enc; //1 eencoding
  67. unsigned char *content; //container
  68. };
  69.  
  70. void readBytes(unsigned char *res, unsigned int size, FILE *file) {
  71. for (int i = 0; i < size; i++) {
  72. res[i] = getc(file);
  73. //printf("%c",res[i]);
  74. }
  75. }
  76.  
  77. void writeBytes(unsigned char *res, unsigned int size, FILE *file) {
  78. for (int i = 0; i < size; i++) {
  79. putc(res[i], file);
  80. }
  81. }
  82.  
  83. struct tagHeader readTagHeader(FILE *file) //function
  84. {
  85. struct tagHeader tag;
  86. unsigned char flags[1]; // flags
  87. unsigned char sizeb[4]; // tag size in bytes
  88. readBytes(tag.name, 3, file);
  89. readBytes(tag.version, 2, file);
  90. readBytes(flags, 1, file);
  91. readBytes(sizeb, 4, file);
  92. tag.flags = flags[0];
  93. tag.size = buffToInteger(sizeb);
  94. return tag;
  95. }
  96.  
  97. void writeTagHeader(FILE *file, struct tagHeader tag) //function
  98. {
  99. unsigned char flags[1]; // flags
  100. unsigned char sizeb[4]; // tag size in bytes
  101. writeBytes(tag.name, 3, file);
  102. writeBytes(tag.version, 2, file);
  103. flags[0] = tag.flags;
  104. writeBytes(flags, 1, file);
  105. integerToBuff(tag.size, sizeb);
  106. writeBytes(sizeb, 4, file);
  107. }
  108.  
  109. void writeFrame(FILE *file, struct oframe frame) //function
  110. {
  111. unsigned char sizeb[4]; // tag size in bytes
  112. unsigned char enc[1]; // tag size in bytes
  113. writeBytes(frame.name, 4, file);
  114. integerToBuffForFrame(frame.size, sizeb);
  115. writeBytes(sizeb, 4, file);
  116. writeBytes(frame.flags, 2, file);
  117. enc[0] = frame.enc;
  118. writeBytes(enc, 1, file);
  119. writeBytes(frame.content, frame.size - 1, file);
  120. }
  121.  
  122. int checkName(char *name) {
  123. for (int i = 0; i < 4; i++) {
  124. if ((name[i] < 60 | name[i] > 90) & (name[i] > 57 | name[i] < 48)) {
  125. return 0;
  126. }
  127. }
  128. return 1;
  129. }
  130.  
  131. struct oframe readoframe(FILE *file, int readedBytes) {
  132. struct oframe frame;
  133. unsigned char sizeb[4]; // tag size in bytes
  134. readBytes(frame.name, 4, file);
  135. readBytes(sizeb, 4, file);
  136. frame.size = buffToIntegerForFrame(sizeb);
  137. if (frame.size + 10 > readedBytes | frame.size == 0 | frame.size > 134 * pow(10, 5) | checkName(frame.name) == 0) {
  138. fseek(file, frame.size + 2, SEEK_CUR);
  139. frame.size = 0;
  140. return frame;
  141. }
  142. frame.content = malloc(frame.size);
  143. readBytes(frame.flags, 2, file);
  144. unsigned char enc[1];
  145. readBytes(enc, 1, file);
  146. frame.enc = enc[0];
  147. readBytes(frame.content, frame.size - 1, file);
  148. return frame;
  149. }
  150.  
  151. void set(char *filepath, char *framename, char *value) {
  152. FILE *fp = fopen(filepath, "rb");
  153. struct tagHeader tag = readTagHeader(fp);
  154. int old_size = tag.size;
  155. tag.framesCount = 0;
  156. //END OF TAG HEADER
  157. int diff = 0;
  158. int bytesReaded = 10;
  159. struct oframe frames[tag.size / 11 + 1];
  160. int i = 0;
  161. while (tag.size > bytesReaded) {
  162. frames[tag.framesCount] = readoframe(fp, tag.size - bytesReaded);
  163. if (frames[tag.framesCount].size == 0) {
  164. break;
  165. }
  166. bytesReaded += 10 + frames[tag.framesCount].size;
  167. tag.framesCount += 1;
  168. }
  169. //END OF READING METADATA FROM FILE
  170. //BEGIN OF WRITING NEW FILE
  171. FILE *outf = fopen("temp.mp3", "wb");
  172. writeTagHeader(outf, tag);
  173. for (int i = 0; i < tag.framesCount; i++) {
  174. if (strcmp(frames[i].name, framename) == 0) {
  175. diff = strlen(value) - strlen(frames[i].content);
  176. tag.size += diff;
  177. strcpy(frames[i].content, value);
  178. frames[i].size = strlen(value) + 1;
  179. }
  180. writeFrame(outf, frames[i]);
  181. printf("%s %d ", frames[i].name, frames[i].size);
  182. for (int j = 0; j < frames[i].size; j++) {
  183. printf("%c", frames[i].content[j]);
  184. }
  185. printf("\n");
  186. }
  187. fpos_t pos;
  188. fgetpos(outf, &pos);
  189. int countzeros = 10 + tag.size - (int) pos;
  190. unsigned char zeros[countzeros];
  191. for (int i = 0; i < countzeros; i++) {
  192. zeros[i] = 0;
  193. }
  194. writeBytes(zeros, countzeros, outf);
  195. char tmp;
  196. fseek(fp, old_size + 10, SEEK_SET);
  197. fseek(outf, tag.size + 10, SEEK_SET);
  198. tmp = fgetc(fp);
  199. while (!feof(fp)){
  200. fputc(tmp, outf);
  201. tmp = fgetc(fp);
  202. }
  203.  
  204. //writeBytes(tmp, strlen(tmp), outf);
  205.  
  206.  
  207.  
  208. /*fgetpos (outf,&pos);
  209. fseek(fp, 0, SEEK_END); // seek to end of file
  210. int size = (int)ftell(fp)-(int)pos; // get current file pointer
  211. fseek(fp, (int)pos, SEEK_SET); // seek to end of file
  212. while (1==1){
  213. unsigned char a = getc(fp);
  214. if(ferror(fp)>0){
  215. break;
  216. }
  217. putc(a,outf);
  218. }*/
  219. fclose(outf);
  220. fclose(fp);
  221. remove(filepath);
  222. rename("temp.mp3", filepath);
  223. }
  224.  
  225. void get(char *filepath, char *framename) {
  226. FILE *fp = fopen(filepath, "rb");
  227. struct tagHeader tag = readTagHeader(fp);
  228. //END OF TAG HEADER
  229.  
  230. int bytesReaded = 10;
  231. struct oframe frames[tag.size / 11 + 1];
  232. int i = 0;
  233.  
  234. while (tag.size > bytesReaded) {
  235. struct oframe buff = readoframe(fp, tag.size - bytesReaded);
  236. if (buff.size == 0)
  237. break;
  238.  
  239. frames[i] = buff;
  240. if (strcmp(frames[i].name, framename) == 0) {
  241. printf("%s data: ", framename);
  242. for (int j = 0; j < frames[i].size - 1; j++) {
  243. printf("%c", frames[i].content[j]);
  244. }
  245.  
  246. i++;
  247. for (int j = 0; j < buff.size; ++j) //clearing buff container
  248. buff.content[j] = 0;
  249. printf("\n");
  250. break;
  251. }
  252. //printf("%s %d ", frames[i].name, frames[i].size);
  253.  
  254. }
  255. }
  256.  
  257. void show(char *filepath) {
  258. FILE *fp = fopen(filepath, "rb");
  259. struct tagHeader tag = readTagHeader(fp);
  260. printf("%s%s%d%d%s%d\n", tag.name, " : ", tag.version[0], tag.version[1], " : ", tag.size);
  261. //END OF TAG HEADER
  262.  
  263. int bytesReaded = 10;
  264. struct oframe frames[tag.size / 11 + 1];
  265. int i = 0;
  266.  
  267. while (tag.size > bytesReaded) {
  268. struct oframe buff = readoframe(fp, tag.size - bytesReaded);
  269. if (buff.size == 0)
  270. break;
  271.  
  272. frames[i] = buff;
  273. printf("%s %d ", frames[i].name, frames[i].size);
  274. bytesReaded += 10 + frames[i].size;
  275. for (int j = 0; j < frames[i].size - 1; j++)
  276. printf("%c", frames[i].content[j]);
  277.  
  278. i++;
  279. for (int j = 0; j < buff.size; ++j) //clearing buff container
  280. buff.content[j] = 0;
  281. printf("\n");
  282.  
  283.  
  284. }
  285. //END OF FRAME
  286.  
  287. }
  288.  
  289. int main(int argc, char *argv[]) {
  290. //struct oframe frame;
  291. setlocale(LC_ALL, "Rus");
  292. /* char* filepath;
  293. filepath = strpbrk(argv[1],"=") + 1;
  294. for (int i = 2;i < argc; i++){
  295. if (!strcmp(argv[i], "--show")) {
  296. show(filepath);
  297. continue;
  298. }
  299. if (argv[i][2]=='g') {
  300. //get(filepath, strpbrk(argv[i],"=") + 1);
  301. continue;
  302. }
  303. if (argv[i][2]=='s') {
  304. //set(filepath, strpbrk(argv[i],"=") + 1, strpbrk(argv[i + 1], "=") + 1);
  305. continue;
  306. }
  307. }
  308. */
  309. //show("test6.mp3");
  310. //get("test6.mp3", "COMM");
  311. set("test3.mp3", "TYER", "2045");
  312. //show("temp.mp3");
  313. return 0;
  314. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement