diff options
-rw-r--r-- | README.md | 9 | ||||
-rwxr-xr-x | rtv4d-dl | bin | 31224 -> 35272 bytes | |||
-rw-r--r-- | rtv4d-dl.c | 83 | ||||
-rw-r--r-- | tcp.c | 21 |
4 files changed, 70 insertions, 43 deletions
@@ -10,6 +10,7 @@ z uporabo programa se strinjate z naslednjimi stavki: ## funkcije * prenašanje videoposnetkov iz arhiva kot odklenjene videodatoteke +* [**novo!**] z različico 0.0.1 tudi prenašanje avdioposnetkov! ## možnosti uporabe programa * prenos oddaje: `rtv4d-dl oddaja <URL/ID oddaje> [izhodna datoteka]` @@ -22,12 +23,12 @@ z uporabo programa se strinjate z naslednjimi stavki: - primer: `rtv4d-dl slicica-oddaja 89614963 89614963.jpg` # dodatne informacije: -* pisanje v STDOUT: kot pot datoteke napišite `/dev/stdout` (samo POSIX) -* program se poveže na 4D strežnik 4d.rtvslo.si, spremenite izv. kodo za drugega +* pisanje v STDOUT: kot pot datoteke napišite `/dev/stdout`-POSIX ali `CON`-MS +* program se poveže na \*.rtvslo.si, spremenite izvorno kodo za drugo infrastru. # trenutna izdaja programa: -* program je bil nazadnje ročno testiran 9. decembra 2020 in takrat je DELOVAL. -* različica: 0.0.0 +* program je bil nazadnje ročno testiran 11. decembra 2020 in takrat je DELOVAL. +* različica: 0.0.1 # o * program je spisan 100% v C programskem jeziku Binary files differ@@ -40,7 +40,7 @@ do { if ( RTV_NAPISI_ ##kaj ) fprintf(stderr, \ "[" #kaj "] %s@%s:" NIZ(__LINE__) " " frmt "\n", \ __func__, __FILE__, ##__VA_ARGS__ ); } while(0); -#define RTV_USER_AGENT "Mozilla/5.0 equivalent (rtv4d-dl; C " \ +#define RTV_USER_AGENT "Mozilla/5.0 equivalent (rtv4d-dl " RTV_VER "; C " \ NIZ(__STDC_VERSION__) " GCC " __VERSION__ "; " __DATE__ " " __TIME__ "; " \ __FILE__ ":" NIZ(__LINE__) ")" #define RTV_HTTP_GET \ @@ -48,7 +48,7 @@ "\r\nAccept: */*\r\nX-Requested-With: tcp.c (" __FILE__ ":" NIZ(__LINE__) \ ")\r\nConnection: close\r\n\r\n" #define RTV_HTTP_TIMEOUT 69 /* sekund */ -#define RTV_NE_BO_POSLAL "ToJeMogočeBackdoor!" +#define RTV_NE_BO_POSLAL NULL /* "ToJeMogočeBackdoor!" */ /* bere več znakov */ #define RTV_API_META_URL "http://api.rtvslo.si/ava/getRecordingDrm/" \ "%u?client_id=" RTV_CLIENT_ID #define RTV_API_META_URL_SIZEOF 128 /* vključno z nul znakom */ @@ -58,6 +58,7 @@ #define RTV_JWT_SIZEOF 43+1 #define RTV_PREDVAJALNIK_URL "http://4d.rtvslo.si/arhiv/v/%u" #define RTV_PREDVAJALNIK_URL_SIZEOF 32+1 + 12 +#define RTV_VER "0.0.1" struct meta_oddaja { size_t naslov_sizeof; @@ -83,7 +84,7 @@ struct meta_oddaja { size_t predvajano_sizeof; char * predvajano; /* 2010-12-03 23:20:10 */ /* unsigned long long int kontrolna_vrednost; */ - unsigned long long int velikost; /* število bajtov posnetka */ + /* unsigned long long int velikost; */ /* število bajtov posnetka */ char get_meta_url[RTV_API_META_URL_SIZEOF]; /* http://api.rtvslo.si/ava/... */ char get_media_url[RTV_API_MEDIA_URL_SIZEOF]; /* http://api.rtvslo.si/av... */ char predvajalnik_url[RTV_PREDVAJALNIK_URL_SIZEOF]; /* http://4d.rtvslo.... */ @@ -146,7 +147,7 @@ int http_get (/* const */ char * u, FILE * r) { /* url ostane enak */ return 1; } if (strncmp(u, "http://", 7) != 0) { - RTV_NAPISI(NAPAKA, "URL protokol ni HTTP oziroma URL ni pravilen"); + RTV_NAPISI(NAPAKA, "URL ni podprt: %s", u); return 2; } k = strchr(RTV_URL_HOST, '/'); @@ -240,13 +241,14 @@ int rtv_meta_izpolni(struct meta_oddaja * m) { size_t sizeloc; size_t i, j; char * metakeys[] = {"\"title\"", "\"showId\"", "\"genre\"", \ - "\"showDescription\"", "\"duration\"", "\"jwt\"", "\"showName\"", \ - "\"source\"", "\"publishDate\"", "\"mediaType\"", "\"orig\"", \ - "\"broadcastDate\"", /* sedaj pa za getMedia query */ "\"http\"" }; + "\"description\"", "\"showDescription\"", "\"duration\"", "\"jwt\"", \ + "\"showName\"", "\"source\"", "\"publishDate\"", "\"mediaType\"", \ + "\"orig\"", "\"broadcastDate\"", /* getMedia query: */ "\"http\"", \ + "\"https\"" }; char * cp; -#define RTV_META_IZPOLNI_METAKEYS_SIZEOF 12 /* hkrati offset za getMedia */ +#define RTV_META_IZPOLNI_METAKEYS_SIZEOF 13 /* hkrati offset za getMedia */ #define RTV_META_IZPOLNI_METAKEYS_GETMEDIA_FINAL \ - (RTV_META_IZPOLNI_METAKEYS_SIZEOF)+1 /* zadnji+1 za getMedia */ + (RTV_META_IZPOLNI_METAKEYS_SIZEOF+1)+1 /* zadnji+1 za getMedia */ #define RTV_META_IZPOLNI_VALUE (odg+i+strlen(metakeys[j])+2) #define RTV_META_IZPOLNI_VALUE_INTERNAL RTV_META_IZPOLNI_VALUE snprintf(m->get_meta_url, RTV_API_META_URL_SIZEOF, RTV_API_META_URL, m->id); @@ -278,16 +280,16 @@ int rtv_meta_izpolni(struct meta_oddaja * m) { #define RTV_META_IZPOLNI_I(imem, format, tip) /* za številke */ \ m->imem = strto##format(RTV_META_IZPOLNI_VALUE_INTERNAL, NULL, 10); #define RTV_META_IZPOLNI(imem, oblika, format, splitter, tip) \ - cp = strchr(RTV_META_IZPOLNI_VALUE_INTERNAL, splitter); \ + do { cp = strchr(RTV_META_IZPOLNI_VALUE_INTERNAL, splitter); \ if (cp == NULL) { \ RTV_NAPISI(OPOZORILO, "Napaka pri iskanju podatka " #imem); \ - strcpy(m->imem, "Napaka pri pridobivanju."); \ + /* strcpy(m->imem, "Napaka pri pridobivanju."); */ /* ni vse s*/ \ } else { \ oblika(imem, format, tip) \ RTV_NAPISI(HROSC, "Shranil metapodatek " #imem ": %" #format, \ m->imem); \ - } -#pragma GCC diagnostic ignored "-Wint-conversion" /* macro dela strcpy na str */ + } } while (0) +/* #pragma GCC diagnostic ignored "-Wint-conversion" */ /* surpressaš opozor. */ RTV_META_IZPOLNI(naslov, RTV_META_IZPOLNI_V, s, '"', char); break; case 1: /* showId */ @@ -297,45 +299,56 @@ int rtv_meta_izpolni(struct meta_oddaja * m) { RTV_META_IZPOLNI(zanri, RTV_META_IZPOLNI_V, s, ']', char); memmove(m->zanri, (m->zanri)+1, strlen(m->zanri)+1); break; - case 3: /* showDescription */ + case 3: /* description */ RTV_META_IZPOLNI(opis, RTV_META_IZPOLNI_V, s, '"', char); break; - case 4: /* duration */ + case 4: /* showDescription */ + if (m->opis[0] == '\0') { /* če je prejšnji spodletel */ + RTV_META_IZPOLNI(opis, RTV_META_IZPOLNI_V, s, '"', char); + } + break; + case 5: /* duration */ #undef RTV_META_IZPOLNI_VALUE_INTERNAL #define RTV_META_IZPOLNI_VALUE_INTERNAL RTV_META_IZPOLNI_VALUE-1 RTV_META_IZPOLNI(dolzina, RTV_META_IZPOLNI_I, u, '"', unsigned int); #undef RTV_META_IZPOLNI_VALUE_INTERNAL #define RTV_META_IZPOLNI_VALUE_INTERNAL RTV_META_IZPOLNI_VALUE break; - case 5: /* jwt */ + case 6: /* jwt */ RTV_META_IZPOLNI(jwt, RTV_META_IZPOLNI_V, s, '"', char); if (RTV_JWT_SIZEOF != m->jwt_sizeof) { RTV_NAPISI(OPOZORILO, "Shranil nepričakovano dolg JWT! Je vdor?"); } break; - case 6: /* showName */ + case 7: /* showName */ RTV_META_IZPOLNI(tip_oddaje_ime, RTV_META_IZPOLNI_V, s, '"', char); break; - case 7: /* source */ + case 8: /* source */ RTV_META_IZPOLNI(program, RTV_META_IZPOLNI_V, s, '"', char); break; - case 8: /* publishDate */ + case 9: /* publishDate */ RTV_META_IZPOLNI(objavljeno, RTV_META_IZPOLNI_V, s, '"', char); break; - case 9: /* mediaType */ - if (RTV_META_IZPOLNI_VALUE[0] == 'v') { - m->tip_posnetka = RTV_VIDEO_TIP; - } else { - m->tip_posnetka = RTV_NEPOZNAN_TIP; + case 10: /* mediaType */ + switch (RTV_META_IZPOLNI_VALUE[0]) { + case 'v': + m->tip_posnetka = RTV_VIDEO_TIP; + break; + case 'a': + m->tip_posnetka = RTV_AUDIO_TIP; + break; + default: + m->tip_posnetka = RTV_NEPOZNAN_TIP; + break; } break; - case 10: /* orig */ /* sličica */ + case 11: /* orig */ /* sličica */ RTV_META_IZPOLNI(slicica, RTV_META_IZPOLNI_V, s, '"', char); break; - case 11: /* broadcastDate */ + case 12: /* broadcastDate */ RTV_META_IZPOLNI(predvajano, RTV_META_IZPOLNI_V, s, '"', char); break; -#pragma GCC diagnostic warning "-Wint-conversion" /* smo prej izključili */ +/* #pragma GCC diagnostic warning "-Wint-conversion" */ /* undo */ default: RTV_NAPISI(OPOZORILO, "Doseg nedefinirane kode!"); } @@ -359,6 +372,15 @@ int rtv_meta_izpolni(struct meta_oddaja * m) { case 0: /* http */ /* videofile */ RTV_META_IZPOLNI(posnetek_url, RTV_META_IZPOLNI_V, s, '"', char); break; + case 1: /* https */ + if (m->posnetek_url[0] == '\0') { + RTV_META_IZPOLNI(posnetek_url, RTV_META_IZPOLNI_V, s, '"', char); + fprintf(stderr, "test: %s\n", m->posnetek_url); + memmove((m->posnetek_url)+4, (m->posnetek_url)+5, + strlen((m->posnetek_url)+5)+1); + RTV_NAPISI(HROSC, "Popravil HTTPS URL na HTTP"); + } + break; default: RTV_NAPISI(OPOZORILO, "Doseg nedefinirane kode!"); } @@ -444,12 +466,13 @@ int main (int argc, char ** argv) { fprintf(fd, "id: %u\nnaslov: %s\ntip_oddaje_id: %u\nzanri: %s\nopis: %s\n" "dolzina: %u\njwt: %s\ntip_oddaje_ime: %s\nprogram: %s\n" "objavljeno: %s\ntip_posnetka: %s\nslicica: %s\npredvajano: %s\n" - "velikost: %llu\nget_meta_url: %s\nget_media_url: %s\n" + /* "velikost: %llu\n" */ "get_meta_url: %s\nget_media_url: %s\n" "predvajalnik_url: %s\nposnetek_url: %s\n", m->id, m->naslov, m->tip_oddaje_id, m->zanri, m->opis, m->dolzina, m->jwt, m->tip_oddaje_ime, m->program, m->objavljeno, - m->tip_posnetka == RTV_VIDEO_TIP ? "RTV_VIDEO_TIP":"RTV_NEPOZNAN_TIP", - m->slicica, m->predvajano, m->velikost, m->get_meta_url, + m->tip_posnetka == RTV_VIDEO_TIP ? "RTV_VIDEO_TIP" : \ + m->tip_posnetka == RTV_AUDIO_TIP ? "RTV_AUDIO_TIP":"RTV_NEPOZNAN_TIP", + m->slicica, m->predvajano, /* m->velikost, */ m->get_meta_url, m->get_media_url, m->predvajalnik_url, m->posnetek_url); fclose(fd); break; @@ -14,6 +14,7 @@ #include <string.h> #include <sys/time.h> #define ERR_INET_ADDR "0.9.9.0" +#define TCPC_READ_BUF 1024 union ip_conv { unsigned char c[4]; struct in_addr in; @@ -86,9 +87,9 @@ int read_until(int conn_fd, FILE * out, unsigned int timeout, const char * ma, unsigned int match = 0; struct timeval start, stop; gettimeofday(&start, NULL); - char c[2] = {'\0', '\0'}; + char c[TCPC_READ_BUF+1]; while (1) { - ret = read(conn_fd, c, 1); + ret = read(conn_fd, c, ma ? 1 : TCPC_READ_BUF); if (ret == -1) { if (errno == EWOULDBLOCK) { } else { @@ -99,18 +100,20 @@ int read_until(int conn_fd, FILE * out, unsigned int timeout, const char * ma, fprintf(stderr, "%s@" __FILE__ ":%d read(): server closed connection\n", __func__, __LINE__); return 0; } else { - fputc(c[0], out); + fwrite(c, ret, 1, out); max_bytes--; if (max_bytes <= 0) { return 0; } - if (ma[match] == c[0]) { - match++; - if (match == strlen(ma)) { - return 0; + if (ma != NULL) { + if (ma[match] == c[0]) { + match++; + if (match == strlen(ma)) { + return 0; + } + } else { + match = 0; } - } else { - match = 0; } } gettimeofday(&stop, NULL); |