Live video on the AT Protocol
fork

Configure Feed

Select the types of activity you want to include in your feed.

at eli/database-resync 1028 lines 33 kB view raw
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`)