shithub: nvi

Download patch

ref: 976b2c3767f139177754bdc7ef7069d535ff7325
parent: d1d1267271f9f0bc6ad4a2a31ad7bc3b6125d820
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Fri Jul 23 03:34:23 EDT 2021

fix peertube links with no streaming playlists; make error reports better

--- a/peertube.c
+++ b/peertube.c
@@ -12,9 +12,10 @@
 	JSONEl *e;
 	int fd, n;
 
+	j = nil;
 	if((x = jfield(f, JSONString, "metadataUrl", nil)) == nil){
-		werrstr("no url");
-		return -1;
+		werrstr("no metadataUrl");
+		goto err;
 	}
 	j = nil;
 	if((fd = hget(jsonstr(x), -1)) >= 0){
@@ -25,15 +26,12 @@
 		close(fd);
 	}
 	procwait();
-	if(j == nil){
-		werrstr("peertube: %r");
-		return -1;
-	}
+	if(j == nil)
+		goto err;
 
 	if((x = jfield(f, JSONString, "fileDownloadUrl", nil)) == nil){
-		werrstr("no url");
-		jsonfree(j);
-		return -1;
+		werrstr("no fileDownloadUrl");
+		goto err;
 	}
 	i->nfmt++;
 	if((i->fmt = realloc(i->fmt, i->nfmt * sizeof(*fmt))) == nil)
@@ -69,6 +67,9 @@
 						s = t;
 					}
 				}
+			}else{
+				werrstr("codec_type missing");
+				goto err;
 			}
 		}
 	}
@@ -82,6 +83,10 @@
 	}
 
 	return 0;
+err:
+	werrstr("addfmt: %r");
+	jsonfree(j);
+	return -1;
 }
 
 Info *
@@ -94,6 +99,7 @@
 	Info *i;
 
 	peertube = 0;
+	i = nil;
 	if((fd = hget(url, -1)) >= 0){
 		if((s = readall(fd)) != nil){
 			if((o = strstr(s, "property=\"og:platform\"")) != nil && strstr(o+23, "content=\"PeerTube\"") != nil)
@@ -126,10 +132,8 @@
 		close(fd);
 	}
 	procwait();
-	if(j == nil){
-		werrstr("peertube: %r");
-		return nil;
-	}
+	if(j == nil)
+		goto err;
 
 	if((i = calloc(1, sizeof(*i))) == nil)
 		sysfatal("memory");
@@ -141,11 +145,20 @@
 	if((s = jsonstr(jsonbyname(j, "publishedAt"))) != nil)
 		tmparse(&i->published, "YYYY-MM-DDThh:mm:ss.ttt", s, nil, nil);
 
+	if((z = jfield(j, JSONArray, "files", nil)) != nil){
+		for(f = z->first; f != nil; f = f->next){
+			if(addfmt(i, f->val) != 0)
+				goto err;
+		}
+	}
+
 	if((z = jfield(j, JSONArray, "streamingPlaylists", nil)) != nil){
 		for(e = z->first; e != nil; e = e->next){
 			if((z = jfield(e->val, JSONArray, "files", nil)) != nil){
-				for(f = z->first; f != nil; f = f->next)
-					addfmt(i, f->val);
+				for(f = z->first; f != nil; f = f->next){
+					if(addfmt(i, f->val) != 0)
+						goto err;
+				}
 			}
 		}
 	}
@@ -153,4 +166,8 @@
 	jsonfree(j);
 
 	return i;
+err:
+	werrstr("peertube: %r");
+	free(i);
+	return nil;
 }
--- a/util.c
+++ b/util.c
@@ -100,6 +100,8 @@
 	char *argv[] = {"hget", url, nil};
 	int p[2];
 
+	if(debug)
+		fprint(2, "GET %s\n", url);
 	if(out >= 0){
 		p[0] = open("/dev/null", OREAD);
 		p[1] = out;
--- a/youtube.c
+++ b/youtube.c
@@ -54,6 +54,7 @@
 	int fd;
 
 	j = nil;
+	i = nil;
 	if((fd = hget(instlst, -1)) >= 0){
 		if((s = readall(fd)) != nil){
 			j = jsonparse(s);
@@ -64,7 +65,7 @@
 	procwait();
 	if(j == nil){
 		werrstr("instances: %r");
-		return nil;
+		goto err;
 	}
 
 	for(e = j->first, i = nil; e != nil && i == nil; e = e->next){
@@ -100,10 +101,8 @@
 			tmtime(&i->published, jint(z, "published"), nil);
 
 			for(fmtname = fmtnames; *fmtname; fmtname++){
-				if((x = jsonbyname(z, *fmtname)) == nil){
-					if(debug) fprint(2, "%s: no streams\n", u);
+				if((x = jsonbyname(z, *fmtname)) == nil)
 					continue;
-				}
 
 				for(f = x->first; f != nil; f = f->next)
 					addfmt(i, f->val);
@@ -127,4 +126,9 @@
 	jsonfree(j);
 
 	return i;
+err:
+	werrstr("youtube: %r");
+	free(i);
+	jsonfree(j);
+	return nil;
 }