channel2tsv.c - frontends - front-ends for some sites (experiment) (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- channel2tsv.c (1957B) --- 1 #include <sys/socket.h> 2 #include <sys/types.h> 3 4 #include <ctype.h> 5 #include <errno.h> 6 #include <netdb.h> 7 #include <stdarg.h> 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <string.h> 11 #include <unistd.h> 12 13 #include "https.h" 14 #include "util.h" 15 #include "youtube.h" 16 17 #define OUT(s) fputs((s), stdout) 18 #define OUTESCAPE(s) printescape((s)) 19 20 /* print: ignore control-characters */ 21 void 22 printescape(const char *s) 23 { 24 for (; *s; ++s) 25 if (!iscntrl((unsigned char)*s)) 26 fputc(*s, stdout); 27 } 28 29 int 30 render(struct search_response *r) 31 { 32 struct item *videos = r->items; 33 size_t i; 34 35 if (pledge("stdio", NULL) == -1) { 36 fprintf(stderr, "pledge: %s\n", strerror(errno)); 37 exit(1); 38 } 39 40 for (i = 0; i < r->nitems; i++) { 41 switch (videos[i].linktype) { 42 case Channel: 43 case Movie: 44 case Playlist: 45 continue; 46 default: 47 break; 48 } 49 50 OUTESCAPE(videos[i].id); 51 OUT("\t"); 52 if (videos[i].id[0]) { 53 OUT("https://www.youtube.com/embed/"); 54 OUTESCAPE(videos[i].id); 55 } 56 OUT("\t"); 57 OUTESCAPE(videos[i].title); 58 OUT("\t"); 59 OUTESCAPE(videos[i].publishedat); 60 OUT("\t"); 61 OUTESCAPE(videos[i].viewcount); 62 OUT("\t"); 63 OUTESCAPE(videos[i].duration); 64 OUT("\n"); 65 } 66 67 return 0; 68 } 69 70 static void 71 usage(const char *argv0) 72 { 73 fprintf(stderr, "usage: %s <channelid>\n", argv0); 74 exit(1); 75 } 76 77 int 78 main(int argc, char *argv[]) 79 { 80 struct search_response *r; 81 char channelid[1024]; 82 83 if (pledge("stdio dns inet rpath unveil", NULL) == -1) { 84 fprintf(stderr, "pledge: %s\n", strerror(errno)); 85 exit(1); 86 } 87 if (unveil(TLS_CA_CERT_FILE, "r") == -1) { 88 fprintf(stderr, "unveil: %s\n", strerror(errno)); 89 exit(1); 90 } 91 if (unveil(NULL, NULL) == -1) { 92 fprintf(stderr, "unveil: %s\n", strerror(errno)); 93 exit(1); 94 } 95 96 if (argc < 2 || !argv[1][0]) 97 usage(argv[0]); 98 if (!uriencode(argv[1], channelid, sizeof(channelid))) 99 usage(argv[0]); 100 101 r = youtube_channel_videos(channelid); 102 if (!r || r->nitems == 0) 103 exit(1); 104 105 render(r); 106 107 return 0; 108 }