Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.60 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "string.h"
  4.  
  5. /*
  6. file structure:
  7. ID3v2/file identifier "ID3"
  8. ID3v2 version $03 00
  9. ID3v2 flags %abc00000
  10. ID3v2 size 4 * %0xxxxxxx
  11. Frame ID $xx xx xx xx (four characters)
  12. Size $xx xx xx xx
  13. Flags $xx xx
  14. <Frame contents>
  15. etc...
  16. */
  17.  
  18. unsigned int bswap_32(unsigned int num){
  19. return ((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | ((num >> 8) & 0xff00) | ((num << 24) & 0xff000000);
  20. }
  21.  
  22. void filecopy(FILE *fp, FILE *ofp){
  23. int c;
  24. while ((c = getc(fp)) != EOF) putc(c, ofp);
  25. }
  26.  
  27. union tag_header{
  28. char buffer[12];
  29. struct{
  30. unsigned short empty;
  31. unsigned char version[3];
  32. unsigned char rev1;
  33. unsigned char rev2;
  34. unsigned char flags;
  35. unsigned int size;
  36. } data;
  37. };
  38.  
  39. union frame_header{
  40. char buffer[10];
  41. struct{
  42. unsigned char name[4];
  43. unsigned int size;
  44. unsigned short flags;
  45. } data;
  46. };
  47.  
  48. void show(char* media_file_name){
  49. FILE* media_file = fopen(media_file_name, "rb");
  50. fseek(media_file, 0, SEEK_SET);
  51. union tag_header tag_header;
  52. fread(tag_header.buffer + 2, sizeof(char), 10, media_file);
  53. unsigned int tag_size = bswap_32(tag_header.data.size);
  54. printf("%sv%d.%d\n", tag_header.data.version, tag_header.data.rev1, tag_header.data.rev2);
  55. while (ftell(media_file) < tag_size + 10){
  56. union frame_header frame_header;
  57. fread(frame_header.buffer, sizeof(char), 10, media_file);
  58. printf("%s: ", frame_header.data.name);
  59. unsigned int frame_size = bswap_32(frame_header.data.size);
  60. unsigned char* frame_contents = malloc(sizeof(char) * frame_size);
  61. fread(frame_contents, sizeof(char), frame_size, media_file);
  62. for (unsigned int i = 0; i < frame_size; i++) printf("%c", frame_contents[i]);
  63. printf("\n");
  64. memset(frame_contents, 0, frame_size);
  65. free(frame_contents);
  66. }
  67. fclose(media_file);
  68. }
  69.  
  70. void get(char* media_file_name, char sought_frame_name[4]){
  71. FILE* media_file = fopen(media_file_name, "rb");
  72. union tag_header tag_header;
  73. fread(tag_header.buffer + 2, sizeof(char), 10, media_file);
  74. unsigned int tag_size = bswap_32(tag_header.data.size);
  75. while (ftell(media_file) < tag_size + 10){
  76. union frame_header frame_header;
  77. fread(frame_header.buffer, sizeof(char), 10, media_file);
  78. long long current_frame_size = bswap_32(frame_header.data.size);
  79. if (!strcmp(frame_header.data.name, sought_frame_name)){
  80. printf("%s: ", frame_header.data.name);
  81. unsigned int frame_size = bswap_32(frame_header.data.size);
  82. unsigned char* frame_contents = malloc(sizeof(char) * frame_size);
  83. fread(frame_contents, sizeof(char), frame_size, media_file);
  84. for (unsigned int i = 0; i < frame_size; i++) printf("%c", frame_contents[i]);
  85. printf("\n");
  86. free(frame_contents);
  87. fclose(media_file);
  88. return;
  89. }
  90. fseek(media_file, current_frame_size, SEEK_CUR);
  91. }
  92. fclose(media_file);
  93. printf("No value found for %s!\n", sought_frame_name);
  94. }
  95.  
  96. void set(char* media_file_name, char new_frame_name[4], char* new_frame_value){
  97. FILE* media_file = fopen(media_file_name, "rb");
  98. union tag_header tag_header;
  99. fread(tag_header.buffer + 2, sizeof(char), 10, media_file);
  100. unsigned int tag_size = bswap_32(tag_header.data.size);
  101. long long frame_to_change_pos = 0, frame_to_change_size = 0;
  102. while (ftell(media_file) < tag_size + 10){
  103. union frame_header frame_header;
  104. fread(frame_header.buffer, sizeof(char), 10, media_file);
  105. long long current_frame_size = bswap_32(frame_header.data.size);
  106. if (!strcmp(frame_header.data.name, new_frame_name)){
  107. frame_to_change_pos = ftell(media_file) - 10;
  108. frame_to_change_size = current_frame_size;
  109. break;
  110. }
  111. fseek(media_file, current_frame_size, SEEK_CUR);
  112. }
  113. if (frame_to_change_pos == 0) frame_to_change_pos = ftell(media_file);
  114. unsigned int new_value_size = strlen(new_frame_value);
  115. unsigned int new_tag_size = tag_size - frame_to_change_size + new_value_size;
  116. if (new_value_size == 0) new_tag_size -= 10;
  117. char* media_file_copy_name;
  118. media_file_copy_name = "temp.mp3";
  119. FILE* media_file_copy = fopen(media_file_copy_name, "wb");
  120. fseek(media_file, 0, SEEK_SET);
  121. fseek(media_file_copy, 0, SEEK_SET);
  122. filecopy(media_file, media_file_copy);
  123. fclose(media_file_copy);
  124. fclose(media_file);
  125. media_file_copy = fopen(media_file_copy_name, "rb");
  126. media_file = fopen(media_file_name, "wb");
  127. tag_header.data.size = bswap_32(new_tag_size);
  128. fwrite(tag_header.buffer + 2, sizeof(char), 10, media_file);
  129. fseek(media_file_copy, 10, SEEK_SET);
  130. for(unsigned long long i = 0; i < frame_to_change_pos - 10; i++){
  131. int c;
  132. c = getc(media_file_copy);
  133. putc(c, media_file);
  134. }
  135. if (new_value_size){
  136. union frame_header frame_header;
  137. frame_header.data.name[0] = new_frame_name[0];
  138. frame_header.data.name[1] = new_frame_name[1];
  139. frame_header.data.name[2] = new_frame_name[2];
  140. frame_header.data.name[3] = new_frame_name[3];
  141. frame_header.data.size = bswap_32(new_value_size);
  142. frame_header.data.flags = 0;
  143. fwrite(frame_header.buffer, sizeof(char), 10, media_file);
  144. }
  145. fwrite(new_frame_value, sizeof(char), new_value_size, media_file);
  146. fseek(media_file_copy, frame_to_change_pos + 10 + frame_to_change_size , SEEK_SET);
  147. for(unsigned long long i = ftell(media_file); i < new_tag_size; i++){
  148. unsigned short int c;
  149. c = getc(media_file_copy);
  150. putc(c, media_file);
  151. }
  152. printf("Frame set: %s -> \"%s\"\n", new_frame_name, new_frame_value);
  153. filecopy(media_file_copy, media_file);
  154. fclose(media_file);
  155. fclose(media_file_copy);
  156. remove(media_file_copy_name);
  157. }
  158.  
  159. int main(int argc, char* argv[]){
  160. char* filepath;
  161. filepath = strpbrk(argv[1],"=") + 1;
  162. for (int i = 2;i < argc; i++){
  163. if (!strcmp(argv[i], "--show")){
  164. show(filepath);
  165. continue;
  166. }
  167. if (argv[i][2]=='g'){
  168. get(filepath, strpbrk(argv[i],"=") + 1);
  169. continue;
  170. }
  171. if (argv[i][2]=='s'){
  172. set(filepath, strpbrk(argv[i],"=") + 1, strpbrk(argv[i + 1], "=") + 1);
  173. continue;
  174. }
  175. }
  176. return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement