fork
Configure Feed
Select the types of activity you want to include in your feed.
Live video on the AT Protocol
fork
Configure Feed
Select the types of activity you want to include in your feed.
1package api
2
3import (
4 "bytes"
5 "context"
6 "fmt"
7 "io"
8 "net/http"
9 "net/http/httptest"
10 "testing"
11
12 "github.com/julienschmidt/httprouter"
13 "github.com/stretchr/testify/require"
14 "stream.place/streamplace/pkg/config"
15 "stream.place/streamplace/pkg/model"
16)
17
18func TestRegexStreamplace(t *testing.T) {
19 tests := []struct {
20 filename string
21 shouldMatch bool
22 expectedGroups []string
23 }{
24 // Test cases for the 're' regex
25 {"streamplace-v1.2.3-abcdef-foo-bar.txt", true, []string{"", "v1.2.3", "-abcdef", "foo", "bar", "", "txt"}},
26 {"streamplace-v1.0.0-123456-hello-world.csv", true, []string{"", "v1.0.0", "-123456", "hello", "world", "", "csv"}},
27 {"streamplace-v2.5.1-abc123-done-done.xml", true, []string{"", "v2.5.1", "-abc123", "done", "done", "", "xml"}},
28 {"streamplace-v3.2.1-xyz-abc.json", true, []string{"", "v3.2.1", "", "xyz", "abc", "", "json"}},
29 {"streamplace-v3.2.1-nohash-xyz.json", true, []string{"", "v3.2.1", "", "nohash", "xyz", "", "json"}},
30 {"streamplace-v10.2.10-abc123-linux-amd64.json", true, []string{"", "v10.2.10", "-abc123", "linux", "amd64", "", "json"}},
31 {"streamplace-v10.2.10-darwin-arm64.json", true, []string{"", "v10.2.10", "", "darwin", "arm64", "", "json"}},
32 {"streamplace-desktop-v3.2.1-nohash-xyz.json", true, []string{"-desktop", "v3.2.1", "", "nohash", "xyz", "", "json"}},
33 {"streamplace-desktop-v10.2.10-abc123-linux-amd64.json", true, []string{"-desktop", "v10.2.10", "-abc123", "linux", "amd64", "", "json"}},
34 {"streamplace-desktop-v10.2.10-darwin-arm64.json", true, []string{"-desktop", "v10.2.10", "", "darwin", "arm64", "", "json"}},
35 {"streamplace-desktop-v10.2.10-darwin-arm64.json", true, []string{"-desktop", "v10.2.10", "", "darwin", "arm64", "", "json"}},
36 {"streamplace-desktop-v0.1.3-5742a5a4-windows-amd64.1cbc2208decb3e55c7aea7320258aa36e3297f18.nupkg", true, []string{"-desktop", "v0.1.3", "-5742a5a4", "windows", "amd64", "1cbc2208decb3e55c7aea7320258aa36e3297f18", "nupkg"}},
37
38 // Test cases where the regex should not match
39 {"streamplace-123-abc.txt", false, nil},
40 {"streamplace-v1.2.3-abc.txt", false, nil},
41 }
42
43 for _, test := range tests {
44 t.Run(test.filename, func(t *testing.T) {
45 match := re.FindStringSubmatch(test.filename)
46 if test.shouldMatch {
47 require.NotNil(t, match, "Expected match for filename %s", test.filename)
48 require.Len(t, match, len(test.expectedGroups)+1, "Unexpected number of capture groups for filename %s", test.filename)
49 for i, expected := range test.expectedGroups {
50 require.Equal(t, expected, match[i+1], "Unexpected group %d for filename %s", i, test.filename)
51 }
52 } else {
53 require.Nil(t, match, "Expected no match for filename %s", test.filename)
54 }
55 })
56 }
57}
58
59func TestRegexInput(t *testing.T) {
60 tests := []struct {
61 filename string
62 shouldMatch bool
63 expectedGroups []string
64 }{
65 // Test cases for the 'inputRe' regex
66 {"streamplace-foo-bar.txt", true, []string{"", "foo", "bar", "txt"}},
67 {"streamplace-abc-def.csv", true, []string{"", "abc", "def", "csv"}},
68 {"streamplace-x-y.xml", true, []string{"", "x", "y", "xml"}},
69 {"streamplace-hello-world.json", true, []string{"", "hello", "world", "json"}},
70 {"streamplace-desktop-x-y.xml", true, []string{"-desktop", "x", "y", "xml"}},
71 {"streamplace-desktop-hello-world.json", true, []string{"-desktop", "hello", "world", "json"}},
72
73 // Test cases where the regex should not match
74 {"streamplace-foo.txt", false, nil},
75 {"streamplace-foo-bar-baz.txt", false, nil},
76 {"streamplace-foo-bar-baz-qux.txt", false, nil},
77 {"streamplacefoo-bar.txt", false, nil},
78 {"streamplace-foo-bar.", false, nil},
79 }
80
81 for _, test := range tests {
82 t.Run(test.filename, func(t *testing.T) {
83 match := inputRe.FindStringSubmatch(test.filename)
84 if test.shouldMatch {
85 require.NotNil(t, match, "Expected match for filename %s", test.filename)
86 require.Len(t, match, len(test.expectedGroups)+1, "Unexpected number of capture groups for filename %s", test.filename)
87 for i, expected := range test.expectedGroups {
88 require.Equal(t, expected, match[i+1], "Unexpected group %d for filename %s", i, test.filename)
89 }
90 } else {
91 require.Nil(t, match, "Expected no match for filename %s", test.filename)
92 }
93 })
94 }
95}
96
97func TestDownloadRedirects(t *testing.T) {
98 branch := "electron"
99 cli := &config.CLI{GitLabURL: "https://example.com/api/v4/projects/173"}
100 queryGitlab = func(url string) (io.ReadCloser, error) {
101 pkgURL := fmt.Sprintf("%s/packages?order_by=created_at&sort=desc&package_name=%s", cli.GitLabURL, branch)
102 fileURL := fmt.Sprintf("%s/packages/339/package_files", cli.GitLabURL)
103 var bs []byte
104 if url == pkgURL {
105 bs = packageRes
106 } else if url == fileURL {
107 bs = fileRes
108 } else {
109 return nil, fmt.Errorf("unknown url: '%s' (wanted '%s' or '%s')", url, pkgURL, fileURL)
110 }
111 r := bytes.NewReader(bs)
112 return io.NopCloser(r), nil
113 }
114 defer func() { queryGitlab = queryGitlabReal }()
115 tests := []struct {
116 in string
117 out string
118 }{
119 {
120 in: "streamplace-linux-amd64.tar.gz",
121 out: "v0.1.3-51aab8b5/streamplace-v0.1.3-51aab8b5-linux-amd64.tar.gz",
122 },
123 {
124 in: "streamplace-linux-arm64.tar.gz",
125 out: "v0.1.3-51aab8b5/streamplace-v0.1.3-51aab8b5-linux-arm64.tar.gz",
126 },
127 {
128 in: "streamplace-darwin-amd64.tar.gz",
129 out: "v0.1.3-51aab8b5/streamplace-v0.1.3-51aab8b5-darwin-amd64.tar.gz",
130 },
131 {
132 in: "streamplace-darwin-arm64.tar.gz",
133 out: "v0.1.3-51aab8b5/streamplace-v0.1.3-51aab8b5-darwin-arm64.tar.gz",
134 },
135 {
136 in: "streamplace-windows-amd64.zip",
137 out: "v0.1.3-51aab8b5/streamplace-v0.1.3-51aab8b5-windows-amd64.zip",
138 },
139 {
140 in: "streamplace-desktop-windows-amd64.exe",
141 out: "v0.1.3-51aab8b5/streamplace-desktop-v0.1.3-51aab8b5-windows-amd64.exe",
142 },
143 {
144 in: "streamplace-desktop-darwin-amd64.dmg",
145 out: "v0.1.3-51aab8b5/streamplace-desktop-v0.1.3-51aab8b5-darwin-amd64.dmg",
146 },
147 {
148 in: "streamplace-desktop-darwin-arm64.dmg",
149 out: "v0.1.3-51aab8b5/streamplace-desktop-v0.1.3-51aab8b5-darwin-arm64.dmg",
150 },
151 {
152 in: "streamplace-desktop-darwin-amd64.zip",
153 out: "v0.1.3-51aab8b5/streamplace-desktop-v0.1.3-51aab8b5-darwin-amd64.zip",
154 },
155 {
156 in: "streamplace-desktop-darwin-arm64.zip",
157 out: "v0.1.3-51aab8b5/streamplace-desktop-v0.1.3-51aab8b5-darwin-arm64.zip",
158 },
159 {
160 in: "streamplace-desktop-linux-amd64.AppImage",
161 out: "v0.1.3-51aab8b5/streamplace-desktop-v0.1.3-51aab8b5-linux-amd64.AppImage",
162 },
163 {
164 in: "streamplace-desktop-linux-arm64.AppImage",
165 out: "v0.1.3-51aab8b5/streamplace-desktop-v0.1.3-51aab8b5-linux-arm64.AppImage",
166 },
167 }
168
169 for _, tt := range tests {
170 t.Run(tt.in, func(t *testing.T) {
171 mod := &model.DBModel{}
172 a := StreamplaceAPI{CLI: cli, Model: mod}
173
174 handler := a.HandleAppDownload(context.Background())
175
176 reqURL := fmt.Sprintf("/dl/%s/%s", branch, tt.in)
177
178 req := httptest.NewRequest("GET", reqURL, nil)
179 rr := httptest.NewRecorder()
180
181 handler(rr, req, httprouter.Params{})
182
183 result := rr.Result()
184 require.Equal(t, http.StatusTemporaryRedirect, result.StatusCode, "handler returned wrong status code")
185
186 redirectURL, err := result.Location()
187 require.NoError(t, err, "Failed to get redirect location")
188 fullOut := fmt.Sprintf("%s/packages/generic/%s/%s", cli.GitLabURL, branch, tt.out)
189
190 require.Equal(t, fullOut, redirectURL.String(), "handler returned unexpected redirect URL")
191 })
192 }
193}
194
195var packageRes = []byte(`
196 [
197 {
198 "_links": { "web_path": "/streamplace/streamplace/-/packages/339" },
199 "created_at": "2024-09-19T20:28:06.445Z",
200 "id": 339,
201 "last_downloaded_at": "2024-09-19T20:40:18.942Z",
202 "name": "electron",
203 "package_type": "generic",
204 "pipeline": {
205 "created_at": "2024-09-19T20:08:42.262Z",
206 "id": 572,
207 "iid": 513,
208 "project_id": 1,
209 "ref": "electron",
210 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
211 "source": "push",
212 "status": "running",
213 "updated_at": "2024-09-19T20:08:45.699Z",
214 "user": {
215 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
216 "id": 5,
217 "locked": false,
218 "name": "Eli Streams",
219 "state": "active",
220 "username": "iameli-streams",
221 "web_url": "https://git.stream.place/iameli-streams"
222 },
223 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
224 },
225 "pipelines": [],
226 "status": "default",
227 "tags": [],
228 "version": "v0.1.3-51aab8b5"
229 },
230 {
231 "_links": { "web_path": "/streamplace/streamplace/-/packages/338" },
232 "created_at": "2024-09-18T23:53:51.141Z",
233 "id": 338,
234 "last_downloaded_at": "2024-09-19T00:10:31.948Z",
235 "name": "electron",
236 "package_type": "generic",
237 "pipeline": {
238 "created_at": "2024-09-18T23:33:16.873Z",
239 "id": 571,
240 "iid": 512,
241 "project_id": 1,
242 "ref": "electron",
243 "sha": "78fcaf170355c45134d67010df2caaeaf5a5facc",
244 "source": "push",
245 "status": "success",
246 "updated_at": "2024-09-19T00:11:36.764Z",
247 "user": {
248 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
249 "id": 5,
250 "locked": false,
251 "name": "Eli Streams",
252 "state": "active",
253 "username": "iameli-streams",
254 "web_url": "https://git.stream.place/iameli-streams"
255 },
256 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/571"
257 },
258 "pipelines": [],
259 "status": "default",
260 "tags": [],
261 "version": "v0.1.3-78fcaf17"
262 },
263 {
264 "_links": { "web_path": "/streamplace/streamplace/-/packages/337" },
265 "created_at": "2024-09-17T20:19:55.436Z",
266 "id": 337,
267 "last_downloaded_at": "2024-09-17T21:04:52.491Z",
268 "name": "electron",
269 "package_type": "generic",
270 "pipeline": {
271 "created_at": "2024-09-17T19:26:53.407Z",
272 "id": 567,
273 "iid": 508,
274 "project_id": 1,
275 "ref": "electron",
276 "sha": "4043c87ab6d19db9706ba4a3c05dac766f9e6073",
277 "source": "push",
278 "status": "success",
279 "updated_at": "2024-09-17T21:05:57.420Z",
280 "user": {
281 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
282 "id": 5,
283 "locked": false,
284 "name": "Eli Streams",
285 "state": "active",
286 "username": "iameli-streams",
287 "web_url": "https://git.stream.place/iameli-streams"
288 },
289 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/567"
290 },
291 "pipelines": [],
292 "status": "default",
293 "tags": [],
294 "version": "v0.1.3-4043c87a"
295 },
296 {
297 "_links": { "web_path": "/streamplace/streamplace/-/packages/336" },
298 "created_at": "2024-09-17T04:08:57.406Z",
299 "id": 336,
300 "last_downloaded_at": "2024-09-17T04:34:20.263Z",
301 "name": "electron",
302 "package_type": "generic",
303 "pipeline": {
304 "created_at": "2024-09-17T03:49:53.430Z",
305 "id": 566,
306 "iid": 507,
307 "project_id": 1,
308 "ref": "electron",
309 "sha": "a32eed6761d9375eda907aff7040699b8f18217b",
310 "source": "push",
311 "status": "success",
312 "updated_at": "2024-09-17T04:57:57.731Z",
313 "user": {
314 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/2/avatar.png",
315 "id": 2,
316 "locked": false,
317 "name": "Eli Mallon",
318 "state": "active",
319 "username": "iameli",
320 "web_url": "https://git.stream.place/iameli"
321 },
322 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/566"
323 },
324 "pipelines": [],
325 "status": "default",
326 "tags": [],
327 "version": "v0.1.3-a32eed67"
328 },
329 {
330 "_links": { "web_path": "/streamplace/streamplace/-/packages/335" },
331 "created_at": "2024-09-17T00:18:09.095Z",
332 "id": 335,
333 "last_downloaded_at": "2024-09-17T03:50:09.272Z",
334 "name": "electron",
335 "package_type": "generic",
336 "pipeline": {
337 "created_at": "2024-09-16T23:59:10.080Z",
338 "id": 565,
339 "iid": 506,
340 "project_id": 1,
341 "ref": "electron",
342 "sha": "41ee5c4cb63b490fb7b9d55f3faf828cc4c6b923",
343 "source": "push",
344 "status": "canceled",
345 "updated_at": "2024-09-17T03:50:51.613Z",
346 "user": {
347 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
348 "id": 5,
349 "locked": false,
350 "name": "Eli Streams",
351 "state": "active",
352 "username": "iameli-streams",
353 "web_url": "https://git.stream.place/iameli-streams"
354 },
355 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/565"
356 },
357 "pipelines": [],
358 "status": "default",
359 "tags": [],
360 "version": "v0.1.3-41ee5c4c"
361 },
362 {
363 "_links": { "web_path": "/streamplace/streamplace/-/packages/334" },
364 "created_at": "2024-09-16T23:47:04.209Z",
365 "id": 334,
366 "last_downloaded_at": null,
367 "name": "electron",
368 "package_type": "generic",
369 "pipeline": {
370 "created_at": "2024-09-16T23:27:43.205Z",
371 "id": 564,
372 "iid": 505,
373 "project_id": 1,
374 "ref": "electron",
375 "sha": "fa71bac9aaebc2d54c8020ad93e5bcbd9788eefc",
376 "source": "push",
377 "status": "failed",
378 "updated_at": "2024-09-17T00:22:35.717Z",
379 "user": {
380 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
381 "id": 5,
382 "locked": false,
383 "name": "Eli Streams",
384 "state": "active",
385 "username": "iameli-streams",
386 "web_url": "https://git.stream.place/iameli-streams"
387 },
388 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/564"
389 },
390 "pipelines": [],
391 "status": "default",
392 "tags": [],
393 "version": "v0.1.3-fa71bac9"
394 },
395 {
396 "_links": { "web_path": "/streamplace/streamplace/-/packages/333" },
397 "created_at": "2024-09-16T22:52:23.113Z",
398 "id": 333,
399 "last_downloaded_at": null,
400 "name": "electron",
401 "package_type": "generic",
402 "pipeline": {
403 "created_at": "2024-09-16T22:33:49.464Z",
404 "id": 563,
405 "iid": 504,
406 "project_id": 1,
407 "ref": "electron",
408 "sha": "54d95b19bc394500cf910a5012dd864d2ff35b20",
409 "source": "push",
410 "status": "failed",
411 "updated_at": "2024-09-16T23:32:25.977Z",
412 "user": {
413 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
414 "id": 5,
415 "locked": false,
416 "name": "Eli Streams",
417 "state": "active",
418 "username": "iameli-streams",
419 "web_url": "https://git.stream.place/iameli-streams"
420 },
421 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/563"
422 },
423 "pipelines": [],
424 "status": "default",
425 "tags": [],
426 "version": "v0.1.3-54d95b19"
427 },
428 {
429 "_links": { "web_path": "/streamplace/streamplace/-/packages/332" },
430 "created_at": "2024-09-16T20:29:27.305Z",
431 "id": 332,
432 "last_downloaded_at": "2024-09-16T20:40:19.669Z",
433 "name": "electron",
434 "package_type": "generic",
435 "pipeline": {
436 "created_at": "2024-09-16T20:08:13.199Z",
437 "id": 561,
438 "iid": 502,
439 "project_id": 1,
440 "ref": "electron",
441 "sha": "592325bed64178e791e89301424c60f805ae3835",
442 "source": "push",
443 "status": "success",
444 "updated_at": "2024-09-16T21:28:12.814Z",
445 "user": {
446 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
447 "id": 5,
448 "locked": false,
449 "name": "Eli Streams",
450 "state": "active",
451 "username": "iameli-streams",
452 "web_url": "https://git.stream.place/iameli-streams"
453 },
454 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/561"
455 },
456 "pipelines": [],
457 "status": "default",
458 "tags": [],
459 "version": "v0.1.3-592325be"
460 }
461 ]
462`)
463
464var fileRes = []byte(`
465 [
466 {
467 "created_at": "2024-09-19T20:28:06.468Z",
468 "file_md5": null,
469 "file_name": "streamplace-v0.1.3-51aab8b5-ios-release.xcarchive.tar.gz",
470 "file_sha1": null,
471 "file_sha256": "d4d88c885f1494e3698ac24923a2b1d1e632a6c936d039f392e927fe1c4e8fa0",
472 "id": 1994,
473 "package_id": 339,
474 "pipelines": [
475 {
476 "created_at": "2024-09-19T20:08:42.262Z",
477 "id": 572,
478 "iid": 513,
479 "project_id": 1,
480 "ref": "electron",
481 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
482 "source": "push",
483 "status": "running",
484 "updated_at": "2024-09-19T20:08:45.699Z",
485 "user": {
486 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
487 "id": 5,
488 "locked": false,
489 "name": "Eli Streams",
490 "state": "active",
491 "username": "iameli-streams",
492 "web_url": "https://git.stream.place/iameli-streams"
493 },
494 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
495 }
496 ],
497 "size": 44092840
498 },
499 {
500 "created_at": "2024-09-19T20:29:59.539Z",
501 "file_md5": null,
502 "file_name": "streamplace-v0.1.3-51aab8b5-android-release.apk",
503 "file_sha1": null,
504 "file_sha256": "d409d179f7fa5eb7834607a76a845681d0358b8c1652d2a6206a967a0a1e4a07",
505 "id": 1995,
506 "package_id": 339,
507 "pipelines": [
508 {
509 "created_at": "2024-09-19T20:08:42.262Z",
510 "id": 572,
511 "iid": 513,
512 "project_id": 1,
513 "ref": "electron",
514 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
515 "source": "push",
516 "status": "running",
517 "updated_at": "2024-09-19T20:08:45.699Z",
518 "user": {
519 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
520 "id": 5,
521 "locked": false,
522 "name": "Eli Streams",
523 "state": "active",
524 "username": "iameli-streams",
525 "web_url": "https://git.stream.place/iameli-streams"
526 },
527 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
528 }
529 ],
530 "size": 77485100
531 },
532 {
533 "created_at": "2024-09-19T20:30:00.386Z",
534 "file_md5": null,
535 "file_name": "streamplace-v0.1.3-51aab8b5-darwin-amd64.tar.gz",
536 "file_sha1": null,
537 "file_sha256": "c019a776e3e43b0fc40bdbda972ac6bc98ed1df54016ce4510452044175ab1fb",
538 "id": 1996,
539 "package_id": 339,
540 "pipelines": [
541 {
542 "created_at": "2024-09-19T20:08:42.262Z",
543 "id": 572,
544 "iid": 513,
545 "project_id": 1,
546 "ref": "electron",
547 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
548 "source": "push",
549 "status": "running",
550 "updated_at": "2024-09-19T20:08:45.699Z",
551 "user": {
552 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
553 "id": 5,
554 "locked": false,
555 "name": "Eli Streams",
556 "state": "active",
557 "username": "iameli-streams",
558 "web_url": "https://git.stream.place/iameli-streams"
559 },
560 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
561 }
562 ],
563 "size": 35380619
564 },
565 {
566 "created_at": "2024-09-19T20:30:03.952Z",
567 "file_md5": null,
568 "file_name": "streamplace-v0.1.3-51aab8b5-android-debug.apk",
569 "file_sha1": null,
570 "file_sha256": "4fdef8e9afcc0b50971595470e5373de7e71e49c909b53729d881c1d11998e64",
571 "id": 1997,
572 "package_id": 339,
573 "pipelines": [
574 {
575 "created_at": "2024-09-19T20:08:42.262Z",
576 "id": 572,
577 "iid": 513,
578 "project_id": 1,
579 "ref": "electron",
580 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
581 "source": "push",
582 "status": "running",
583 "updated_at": "2024-09-19T20:08:45.699Z",
584 "user": {
585 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
586 "id": 5,
587 "locked": false,
588 "name": "Eli Streams",
589 "state": "active",
590 "username": "iameli-streams",
591 "web_url": "https://git.stream.place/iameli-streams"
592 },
593 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
594 }
595 ],
596 "size": 165891665
597 },
598 {
599 "created_at": "2024-09-19T20:30:06.333Z",
600 "file_md5": null,
601 "file_name": "streamplace-desktop-v0.1.3-51aab8b5-darwin-amd64.dmg",
602 "file_sha1": null,
603 "file_sha256": "c397c9e689e5aa14e4e608d6b8bfe684aaa80d0fd96e65c2240a23f1bbe2584e",
604 "id": 1998,
605 "package_id": 339,
606 "pipelines": [
607 {
608 "created_at": "2024-09-19T20:08:42.262Z",
609 "id": 572,
610 "iid": 513,
611 "project_id": 1,
612 "ref": "electron",
613 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
614 "source": "push",
615 "status": "running",
616 "updated_at": "2024-09-19T20:08:45.699Z",
617 "user": {
618 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
619 "id": 5,
620 "locked": false,
621 "name": "Eli Streams",
622 "state": "active",
623 "username": "iameli-streams",
624 "web_url": "https://git.stream.place/iameli-streams"
625 },
626 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
627 }
628 ],
629 "size": 138530555
630 },
631 {
632 "created_at": "2024-09-19T20:30:06.515Z",
633 "file_md5": null,
634 "file_name": "streamplace-v0.1.3-51aab8b5-android-release.aab",
635 "file_sha1": null,
636 "file_sha256": "b76828177c0dd02cfe80a763034acdbfd6cedd70e5afd4eefa3221acf7170d75",
637 "id": 1999,
638 "package_id": 339,
639 "pipelines": [
640 {
641 "created_at": "2024-09-19T20:08:42.262Z",
642 "id": 572,
643 "iid": 513,
644 "project_id": 1,
645 "ref": "electron",
646 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
647 "source": "push",
648 "status": "running",
649 "updated_at": "2024-09-19T20:08:45.699Z",
650 "user": {
651 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
652 "id": 5,
653 "locked": false,
654 "name": "Eli Streams",
655 "state": "active",
656 "username": "iameli-streams",
657 "web_url": "https://git.stream.place/iameli-streams"
658 },
659 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
660 }
661 ],
662 "size": 39472720
663 },
664 {
665 "created_at": "2024-09-19T20:30:09.006Z",
666 "file_md5": null,
667 "file_name": "streamplace-v0.1.3-51aab8b5-android-debug.aab",
668 "file_sha1": null,
669 "file_sha256": "0bcf65f37ca70d2f3d904d4eedcb1dc4e162901fe3115a77eedea4aefca0b58e",
670 "id": 2000,
671 "package_id": 339,
672 "pipelines": [
673 {
674 "created_at": "2024-09-19T20:08:42.262Z",
675 "id": 572,
676 "iid": 513,
677 "project_id": 1,
678 "ref": "electron",
679 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
680 "source": "push",
681 "status": "running",
682 "updated_at": "2024-09-19T20:08:45.699Z",
683 "user": {
684 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
685 "id": 5,
686 "locked": false,
687 "name": "Eli Streams",
688 "state": "active",
689 "username": "iameli-streams",
690 "web_url": "https://git.stream.place/iameli-streams"
691 },
692 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
693 }
694 ],
695 "size": 54428823
696 },
697 {
698 "created_at": "2024-09-19T20:30:11.825Z",
699 "file_md5": null,
700 "file_name": "streamplace-desktop-v0.1.3-51aab8b5-darwin-amd64.zip",
701 "file_sha1": null,
702 "file_sha256": "d6507feb9227b374b15eaf5558abdc31a652d977cc0d089352dea494399e9dcd",
703 "id": 2001,
704 "package_id": 339,
705 "pipelines": [
706 {
707 "created_at": "2024-09-19T20:08:42.262Z",
708 "id": 572,
709 "iid": 513,
710 "project_id": 1,
711 "ref": "electron",
712 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
713 "source": "push",
714 "status": "running",
715 "updated_at": "2024-09-19T20:08:45.699Z",
716 "user": {
717 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
718 "id": 5,
719 "locked": false,
720 "name": "Eli Streams",
721 "state": "active",
722 "username": "iameli-streams",
723 "web_url": "https://git.stream.place/iameli-streams"
724 },
725 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
726 }
727 ],
728 "size": 137738479
729 },
730 {
731 "created_at": "2024-09-19T20:30:15.385Z",
732 "file_md5": null,
733 "file_name": "streamplace-v0.1.3-51aab8b5-darwin-arm64.tar.gz",
734 "file_sha1": null,
735 "file_sha256": "2e1425d550c54b52a708a97b6c545ae511bee79f04490867c63331a3560c0a87",
736 "id": 2002,
737 "package_id": 339,
738 "pipelines": [
739 {
740 "created_at": "2024-09-19T20:08:42.262Z",
741 "id": 572,
742 "iid": 513,
743 "project_id": 1,
744 "ref": "electron",
745 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
746 "source": "push",
747 "status": "running",
748 "updated_at": "2024-09-19T20:08:45.699Z",
749 "user": {
750 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
751 "id": 5,
752 "locked": false,
753 "name": "Eli Streams",
754 "state": "active",
755 "username": "iameli-streams",
756 "web_url": "https://git.stream.place/iameli-streams"
757 },
758 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
759 }
760 ],
761 "size": 34455283
762 },
763 {
764 "created_at": "2024-09-19T20:30:20.884Z",
765 "file_md5": null,
766 "file_name": "streamplace-desktop-v0.1.3-51aab8b5-darwin-arm64.dmg",
767 "file_sha1": null,
768 "file_sha256": "92bc4e858a03330a034f2f71d7579f35491b651613050d48a548667cb2d74059",
769 "id": 2003,
770 "package_id": 339,
771 "pipelines": [
772 {
773 "created_at": "2024-09-19T20:08:42.262Z",
774 "id": 572,
775 "iid": 513,
776 "project_id": 1,
777 "ref": "electron",
778 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
779 "source": "push",
780 "status": "running",
781 "updated_at": "2024-09-19T20:08:45.699Z",
782 "user": {
783 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
784 "id": 5,
785 "locked": false,
786 "name": "Eli Streams",
787 "state": "active",
788 "username": "iameli-streams",
789 "web_url": "https://git.stream.place/iameli-streams"
790 },
791 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
792 }
793 ],
794 "size": 132833884
795 },
796 {
797 "created_at": "2024-09-19T20:30:26.199Z",
798 "file_md5": null,
799 "file_name": "streamplace-desktop-v0.1.3-51aab8b5-darwin-arm64.zip",
800 "file_sha1": null,
801 "file_sha256": "06ab9412bdc23e48d124cc6cb032d1f21c75138965ee4c8b87b1524cedfa5318",
802 "id": 2004,
803 "package_id": 339,
804 "pipelines": [
805 {
806 "created_at": "2024-09-19T20:08:42.262Z",
807 "id": 572,
808 "iid": 513,
809 "project_id": 1,
810 "ref": "electron",
811 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
812 "source": "push",
813 "status": "running",
814 "updated_at": "2024-09-19T20:08:45.699Z",
815 "user": {
816 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
817 "id": 5,
818 "locked": false,
819 "name": "Eli Streams",
820 "state": "active",
821 "username": "iameli-streams",
822 "web_url": "https://git.stream.place/iameli-streams"
823 },
824 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
825 }
826 ],
827 "size": 131923036
828 },
829 {
830 "created_at": "2024-09-19T20:39:30.156Z",
831 "file_md5": null,
832 "file_name": "streamplace-v0.1.3-51aab8b5-linux-amd64.tar.gz",
833 "file_sha1": null,
834 "file_sha256": "f7bf0191c5d5bd2d94533f8e3562a0f30df8a166efe97bf2d95802a7a3592054",
835 "id": 2005,
836 "package_id": 339,
837 "pipelines": [
838 {
839 "created_at": "2024-09-19T20:08:42.262Z",
840 "id": 572,
841 "iid": 513,
842 "project_id": 1,
843 "ref": "electron",
844 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
845 "source": "push",
846 "status": "running",
847 "updated_at": "2024-09-19T20:08:45.699Z",
848 "user": {
849 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
850 "id": 5,
851 "locked": false,
852 "name": "Eli Streams",
853 "state": "active",
854 "username": "iameli-streams",
855 "web_url": "https://git.stream.place/iameli-streams"
856 },
857 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
858 }
859 ],
860 "size": 101700182
861 },
862 {
863 "created_at": "2024-09-19T20:39:35.057Z",
864 "file_md5": null,
865 "file_name": "streamplace-desktop-v0.1.3-51aab8b5-linux-amd64.AppImage",
866 "file_sha1": null,
867 "file_sha256": "15f5a5104577cd7eae2c394d897ce06622fc7a0c567dba6c270a521ebf235dcc",
868 "id": 2006,
869 "package_id": 339,
870 "pipelines": [
871 {
872 "created_at": "2024-09-19T20:08:42.262Z",
873 "id": 572,
874 "iid": 513,
875 "project_id": 1,
876 "ref": "electron",
877 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
878 "source": "push",
879 "status": "running",
880 "updated_at": "2024-09-19T20:08:45.699Z",
881 "user": {
882 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
883 "id": 5,
884 "locked": false,
885 "name": "Eli Streams",
886 "state": "active",
887 "username": "iameli-streams",
888 "web_url": "https://git.stream.place/iameli-streams"
889 },
890 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
891 }
892 ],
893 "size": 210871488
894 },
895 {
896 "created_at": "2024-09-19T20:39:38.495Z",
897 "file_md5": null,
898 "file_name": "streamplace-v0.1.3-51aab8b5-linux-arm64.tar.gz",
899 "file_sha1": null,
900 "file_sha256": "3b5f79b11333d3a7466c2f4377ce23c1cbc612fc136fefd5ac7bba4e0729ac0d",
901 "id": 2007,
902 "package_id": 339,
903 "pipelines": [
904 {
905 "created_at": "2024-09-19T20:08:42.262Z",
906 "id": 572,
907 "iid": 513,
908 "project_id": 1,
909 "ref": "electron",
910 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
911 "source": "push",
912 "status": "running",
913 "updated_at": "2024-09-19T20:08:45.699Z",
914 "user": {
915 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
916 "id": 5,
917 "locked": false,
918 "name": "Eli Streams",
919 "state": "active",
920 "username": "iameli-streams",
921 "web_url": "https://git.stream.place/iameli-streams"
922 },
923 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
924 }
925 ],
926 "size": 97621477
927 },
928 {
929 "created_at": "2024-09-19T20:39:43.684Z",
930 "file_md5": null,
931 "file_name": "streamplace-desktop-v0.1.3-51aab8b5-linux-arm64.AppImage",
932 "file_sha1": null,
933 "file_sha256": "82dff1e67de9796879e6a9573257c1f83f71326bf0ba4f33dec97d536a61f31c",
934 "id": 2008,
935 "package_id": 339,
936 "pipelines": [
937 {
938 "created_at": "2024-09-19T20:08:42.262Z",
939 "id": 572,
940 "iid": 513,
941 "project_id": 1,
942 "ref": "electron",
943 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
944 "source": "push",
945 "status": "running",
946 "updated_at": "2024-09-19T20:08:45.699Z",
947 "user": {
948 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
949 "id": 5,
950 "locked": false,
951 "name": "Eli Streams",
952 "state": "active",
953 "username": "iameli-streams",
954 "web_url": "https://git.stream.place/iameli-streams"
955 },
956 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
957 }
958 ],
959 "size": 207205568
960 },
961 {
962 "created_at": "2024-09-19T20:39:46.855Z",
963 "file_md5": null,
964 "file_name": "streamplace-v0.1.3-51aab8b5-windows-amd64.zip",
965 "file_sha1": null,
966 "file_sha256": "e420f638ddc7f6352ea78a30a8efab12672e8840158d2fba04a8cf448a8edaa1",
967 "id": 2009,
968 "package_id": 339,
969 "pipelines": [
970 {
971 "created_at": "2024-09-19T20:08:42.262Z",
972 "id": 572,
973 "iid": 513,
974 "project_id": 1,
975 "ref": "electron",
976 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
977 "source": "push",
978 "status": "running",
979 "updated_at": "2024-09-19T20:08:45.699Z",
980 "user": {
981 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
982 "id": 5,
983 "locked": false,
984 "name": "Eli Streams",
985 "state": "active",
986 "username": "iameli-streams",
987 "web_url": "https://git.stream.place/iameli-streams"
988 },
989 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
990 }
991 ],
992 "size": 67260033
993 },
994 {
995 "created_at": "2024-09-19T20:39:51.454Z",
996 "file_md5": null,
997 "file_name": "streamplace-desktop-v0.1.3-51aab8b5-windows-amd64.exe",
998 "file_sha1": null,
999 "file_sha256": "b0b44dfb460b3faf7dd13f97df9f91815b865283bb92d810304b537cbabaa2b1",
1000 "id": 2010,
1001 "package_id": 339,
1002 "pipelines": [
1003 {
1004 "created_at": "2024-09-19T20:08:42.262Z",
1005 "id": 572,
1006 "iid": 513,
1007 "project_id": 1,
1008 "ref": "electron",
1009 "sha": "51aab8b5ef805a01543c1b7d0646a937905b6597",
1010 "source": "push",
1011 "status": "running",
1012 "updated_at": "2024-09-19T20:08:45.699Z",
1013 "user": {
1014 "avatar_url": "https://git.stream.place/uploads/-/system/user/avatar/5/avatar.png",
1015 "id": 5,
1016 "locked": false,
1017 "name": "Eli Streams",
1018 "state": "active",
1019 "username": "iameli-streams",
1020 "web_url": "https://git.stream.place/iameli-streams"
1021 },
1022 "web_url": "https://git.stream.place/streamplace/streamplace/-/pipelines/572"
1023 }
1024 ],
1025 "size": 175016960
1026 }
1027 ]
1028`)