sora video polling wip

This commit is contained in:
Brandon Thomas committed 2025-10-03 17:07:00 -04:00
1 parent cf89c2bd9e
commit fc28ec9ceb
23 files changed
+317 -26

No files matched your search

@@ -5,7 +5,7 @@ use crate::recipes::maybe_refresh_credentials_on_sora_error::maybe_refresh_crede
use crate::recipes::maybe_upgrade_or_renew_session::maybe_upgrade_or_renew_session;
use crate::requests::common::task_id::TaskId;
use crate::requests::deprecated::job_status::sora_job_status::{get_image_gen_status, StatusRequest, TaskResponse, VideoGenStatusResponse};
use crate::requests::list_tasks::list_tasks::{list_tasks, ListTasksResponse};
use crate::requests::list_classic_tasks::list_classic_tasks::{list_classic_tasks, ListTasksResponse};
use crate::requests::upload::upload_media_from_file::sora_media_upload_from_file;
use crate::requests::upload::upload_media_http_request::SoraMediaUploadResponse;
use anyhow::Error;
@@ -14,7 +14,7 @@ use std::path::Path;
/// Check Sora task statuses with session auto-renewal.
/// If a new sora credential is returned, replace the old one with the new one.
pub async fn list_sora_tasks_with_session_auto_renew(
pub async fn list_classic_sora_tasks_with_session_auto_renew(
credentials: &SoraCredentialSet,
) -> Result<(ListTasksResponse, Option<SoraCredentialSet>), SoraError> {
@@ -23,7 +23,7 @@ pub async fn list_sora_tasks_with_session_auto_renew(
let upgraded_creds = maybe_new_creds.as_ref()
.unwrap_or_else(|| &credentials);
let result = list_tasks(&upgraded_creds).await;
let result = list_classic_tasks(&upgraded_creds).await;
let err = match result {
Ok(response) => return Ok((response, maybe_new_creds)),
@@ -38,7 +38,7 @@ pub async fn list_sora_tasks_with_session_auto_renew(
// TODO(bt,2025-05-28): This should only be done if the credentials were actually refreshed.
info!("Retrying task polling with new credentials...");
let result = list_tasks(&new_creds).await?;
let result = list_classic_tasks(&new_creds).await?;
Ok((result, Some(new_creds)))
}
@@ -1,7 +1,7 @@
pub mod image_remix_with_session_auto_renew;
pub mod image_upload_from_bytes_with_session_auto_renew;
pub mod image_upload_from_file_with_session_auto_renew;
pub mod list_sora_tasks_with_session_auto_renew;
pub mod list_classic_sora_tasks_with_session_auto_renew;
pub mod maybe_refresh_credentials_on_sora_error;
pub mod maybe_upgrade_or_renew_session;
pub mod simple_image_gen_with_session_auto_renew;
@@ -6,6 +6,14 @@ use serde_derive::{Deserialize, Serialize};
pub struct TaskId(pub String);
impl TaskId {
pub fn from_string(id: String) -> Self {
Self(id)
}
pub fn from_str(id: &str) -> Self {
Self(id.to_string())
}
pub fn new(id: String) -> Self {
Self(id)
}
@@ -1,11 +1,11 @@
curl 'https://sora.chatgpt.com/backend/nf/create' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfWDh6WTZ2VzJwUTl0UjNkRTduSzFqTDVnSCIsImV4cCI6MTc2MDMwMDg4NSwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS9hdXRoIjp7InVzZXJfaWQiOiJ1c2VyLWhRNWZjMUFWN3ZOY1FMazJ5ZkVGRVVibyJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfSwiaWF0IjoxNzU5NDM2ODg1LCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6IjE1ZTU5NjYyLTIxOTYtNDE3MS05ODQwLWVlZmRkMTZkZWQzYSIsIm5iZiI6MTc1OTQzNjg4NSwicHdkX2F1dGhfdGltZSI6MTc1OTQzNjg4NDY3NCwic2NwIjpbIm9wZW5pZCIsImVtYWlsIiwicHJvZmlsZSIsIm9mZmxpbmVfYWNjZXNzIiwibW9kZWwucmVxdWVzdCIsIm1vZGVsLnJlYWQiLCJvcmdhbml6YXRpb24ucmVhZCIsIm9yZ2FuaXphdGlvbi53cml0ZSJdLCJzZXNzaW9uX2lkIjoiYXV0aHNlc3NfSU1TS1pmS0ZWMEh4R1I3eGhjNk5DVkRvIiwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMTY0NTkzMDAxOTg2MTk4ODg4MzYifQ.l2dQ26eSPCpKpGONFQACXSn-Rndp5ClfwWEAE1uB2eGECSbbn9-m_9zlA0yWnjqwjXYZ5pdWKbuTgWlDgDEwjsprp2OVFH6GIPVOAVKwSZzUWf8ywdpsQBcYIYTpNWGWTK7HytK3P4Xu5I--nZ4TMZI5_iFrXOb8eS-DOSzqm6DjWfiYRcm9qr4JRJokPsXXl1JnHVm0m9iI6xAgS95B0iPoWvfIHgihxWq5k3LdwM-rzIU2srKAZxjuyOnslHkakKZ5algVcxsDfKR4N8oIyNSoOeHPUKDiGnr-O-PqODbdAwqzo1JJP7Bmskc_5bx01pbi6bUQd5MPnT7qdEbIZexkYjUuV6qRCObmCWNV5WTJwVvdTZ9nBhQ2cp6wmAee3y4buQawtXlnhwNaYgkJtpOBgSYIKnTKPTKjMd1PigO57LgSrUPUHVyDVtZ_qBhIlw_PqAu_bFEfx9xyOiWp72KgyS89-32zeZzJcd6m85NsP_1clIe483GMl6wGYMhGxmJazM_twq28wrXwrI3vWnShhPA0qXLKYgFBT10z937OyNgmxXfNWRMB4OgkgXF5ylFHW0aN_ztu7H2NGx2jCIPn0QkAoc8bSjyW98Ybwn_adMiV4FkEeNLvc-KQf6DcULOYiKDYAZWVthpfc2yTAcJUtqmg9Gkw053xWObrRZ4' \
-H 'content-type: application/json' \
-b '__Host-next-auth.csrf-token=53557711393b5bb42525188b40374f5a2d88c6e62f40ffa7303a6855b7ed3abf%7C666b09f1d850c146bf75cb2ef458d273b49cdcc3536619a4748c8b6f213c7ae0; __Secure-next-auth.callback-url=https%3A%2F%2Fsora.com; _cfuvid=41MbomhrDEOwWq1PxwZypVaYzoaB.18Jvwv7pcEZwsE-1759436874191-0.0.1.1-604800000; oai-did=7c216860-5b73-4e63-983f-142dbcae1809; _cfuvid=3J0VKjFQbgG6Hrj6WpYA0qUMQ1FEb.Q6LBxmKcpfxyY-1759436879377-0.0.1.1-604800000; __cf_bm=A6amfZkzP5mF6VMM6IWMFCGx76Zc7infb4IIsJl.y_U-1759513275-1.0.1.1-YHpxVFHc7HuRvLnJZUYqV5_cFsTl4IQJHtIx1F82rxnk4DyZiJtZeZpmihYxYc38GmSxyqNcgLG7asQpY_SQCKQbAIzPySauv3AcNxFIuZQ; __cflb=0H28vBjUqcdJN5F5i8D8gyGbfU6KPdHGPmAV43mv94y; __cf_bm=YnxDZlIQqRlaAL_mwiFsbihIehwgCQ5m5hAbB5ywJz8-1759513279-1.0.1.1-xuUkakGqQN4IluRXGntBH6yxiSymBpjBRhUmOe9sIrB5hcn8jcIeRH2UfpGNHr2hbSd27ULgJ7zLcdkVgyMESRN2lqAlvFENbxtyP.Ei1lg; cf_clearance=.kz.DV5lLl_xAI2gP8EgTkpVwdjIftRJZYngwpDXo7M-1759513279-1.2.1.1-lL5ZfXJc137uNnBkoBgZTU8PHVxsdGFjlQz_2.D7W1e5c3oWOUJpDgzItw1tJHuLjUpb_pUV3t.gkwhDC8FJ1YVAOsP5gLJMtd3u88ENeVywIqv5UFevMEqWx9ftykyYOo5YQDeyzpCmHIMc27M3a.dbdpObo7foz3hBQZq59ApKLokhNl9.tC_8E77wVtH1qeHsuAMhH8BjDD2KsP9zmbDi.dHitv5MfE1BPPijC.0; cf_clearance=HRNRwdDQ77cyE4AnpAJrMTTMHyraDA8Z9H5O382kfXg-1759513279-1.2.1.1-8IR07RaXitgzhFxOLUtyQCKZLbD8aM18_7FgQlYE9mknbpQ6K77abiTNg7iub3rlrVavoTrJufW8co3mPgRrljOrzEoZ.qjmGfVYJUGSKKKa7CWGAC15DdMMihMZVilj2jp_eC1sOAuXgbxEaR7QoTMUfcKr_2j8DOnZ6ISdQkD1NdR6xBBhGrSVN3FTAXiJ3GSthnzwFQEIqrMvLTI10wFZQrAGQPfBFfQt9Ir.VkQ; oai-sc=0gAAAAABo4ArA8k5QOFRdnIRvcTY0StzTu1xvrrwcMw-zx_Z8udzogOUxSBc6Bb4NcmMfNmgJ8-IVdajuMyCqYyQw4SYe13w8ev8ydftBOuPp4tlfLJAOM9CtkSlWilKeJxM1eL3qm4QSX0k7CT6BiIDOW0HANclGTmpM471Fk8y43BkuypFNG7c3ScTcSLUMEBqFfayttl4zJleGafscgfvQWo5zqnlJfA; __Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..Hnw3hRsSeLnw2jF8.Go37dT_kOzeMROBsINCgknMy7dGYt6EXpmgK8jxi6fnlG_YtZzjFuKoY_xLxa51Q6GcWatqCnBnxj23K9MdMnwjKkaXWMm-zzWxGbdKI6cYfITNi0oDW59ieCB23dOAF8oqIhK1Hgrq2pEj4MLsK5h4GlS61SxDmgKEiOfM5VCz9uozD0wH7Pdecfk41szaSSs-vu2glT3wiKHn7f2ST8kl9I6CxcOwe2qYeWCMEKqTH2uERT7cRQ0PXC1qCL-N3N0oAiqiiVme4QKzbrdd9GRrcuyadXDPORmNQ5QSzwlfs4LVbHzHFYwyQdPJlYBJKmH1tmwGPWGt483OBbXuBCKCyvSX99bW7EiKETy2SC1KtOhPYh-BT-LVrgd4Nhiyy8OHJlI3UboW4OveRRdyTuhKmX5_li30uiZXKiPaAuYWXz2xvi8a2XusIF4IZvNzIIpsDidFOCExjqDt70xeEPLbW4ojPyfIxqGyrTqsuiJ9yTBgKemOcnXhm24udGbPpmFCPnXLe8iiZUJLDBVNUq-k7Fj2RbiQ5aRM31a4RcK_fxddyRTQwAInmm4_NXOA_agOtUUhGfTtkiknIYcvhsG2pJVNFmavVJfqP9jvnMI6syIltw_-7MOSChCXOsQsPmMniZOdCF58FWuEI1D7qd0pQeRhiadgV5olErauS25zhV90w4ozOGo5TiYFJo0s6_7RTI-1mIaRPE5m0o0J1t3gIONDasZv1zUu1YnS6iNRa5C01Pcqxj14vekoYz01YUNuHYIVTg0wfAzs1rvosRNW5XCN6ij0M8ugfv3hWZH3Qy5iWaI51cCmnCWgGZolcu0t-qif8xo0MhWlnbASfXNKYEQcDb7bAitTQhY62tCyjvJ4GcoB0yPnu_9jEGlVtQD_Xmmg2wmzZLrNN4nEGF6rIax6sIqA6MI1AYX4TKULd2LD4cC6XceadPOeQKPF6cSiRiV2ANqLlM7VsHCv07hd2-OBGxHSxNAdWeSmnF99Gm3tkyCYwE-Fho1LajXRpaH9MFErQqs_LIawESL7ZqvefLdu4ZfxYKqMBvftPzbIeOF9p4orI0n-jCny28qv1_u_xACR8o9M47Qi3FSrEEkxDlBFcjOa9Xh72y2bzLEtqI4DhJGhlBd3oN9gjv9Wu_--veIA0bDKwKT6E5Vt2KAXCTsfHeOEg9CG8HJVo4O6ZiZPBPCjQB9Z8yuC5ZRTgIyTZlOEkX3PFOofk7I4dAIVSL26PwGqcQIgGmxop6437L_aQnqgHjV01dQcduR0MUqjriQXHisHQxuQHTAYYEoJPKB7aLCO112WicaLRhiacAhVV00g2IePXlpO6DsKhCLS1VddbqrYF7KFvssAYmQCas3P8unFvjoDXQlAHgHKsI1YPzeCtR9ZWhXfKlSD8jhqaaeExltCNaM4aRRjTEs8p-dtFp6_qdniS8sV5m4kDF4KXAgoldjk98dhyosFG5rL45MU-y2tmoIpGcuQ3yLc_TYNLBnI6mnuveosVM4fG-BcrnLPNeNHGWzvJWb6oRPglXvWw400YUXRuYZ4lJS3xfSgrCPkXLmdNLnispXtH4702gQMoBjXJTdZI64HT8pPOJpz1TQLPFWXvs0oVSdcoXiewX3pCnzTHOybPJUMgOh4S4gqfJ3XDq_KK6pGQw4L63BWfWkxmSXstAIjCipqY-e-Epu1CWiqraJX7YvMzRIHalITTKl8JstTGqDjypIByQsju7eS44T5shxX3kkC4KHZhgtQYrOybygdpzhi2fs2rM90wk_ayXq_RTn75tjisJv3MfkwvjDAfixnYpsvFObxm4Qtt1a6GXs6ZCKaeTPkhJwQduBIxSm3aaoyMy3eMgHOpabG6ifdGNACGXgD47MOr5rzpRiSgRR6AyLl0W154tp26A0UojlQeh4qBn9Q9-8I3_z0-JwqCedWr9KbM2fKA-j7_Js12PDSDpojaSDuuq6qcAuOZEPpPCEsAugS8CGsoFJ_GGhIUA5BfMa-aaQj17RmHDKK9DYqC1mM-YLiPn0gJhdZnpQZd102W6Wtt7opJ9Y3R4UiUsEtYT75dhYEVyXXCj-f3Mgc6w5RZI6tzTntFgpmfGXqAxeiQhLzY26xwE9-L0TZ5PxJDpCkMwOAFzwvRelUQwuxcPaZWeWlWwT7oquhAF7SMo87tLV-FJwb1xwLy-gfiDq88-OEtqtkZ6d4PnDH7z4wGwWuXsjGUhaB3sBAmBVM55n_li42ikao3u1ZWyNhEiKht2y1hJzH9Tnt-zLMnuz8BWVu_D_qfwRkvI1MtiiX5zD1_0FQdOHaWsVfIjigTsxNumzAo6qh-tth3DG0kzV0tk2tSxRXiw0dK1PkyZoZeBUgER5CmFpYj1tr6QjvEb5kt8g_Y1MV2qRfMjSkfIWc9aqeyoVI-a8HJycCsspV4wDyhGlGjtWn6_sApSa82FsrDOVZ13u9FNHnEWflB9dw_aajPzgkPF_UeIS3s-p72orQoYVohmjaIZ_AAfFv-zPY8jR06se1vo-z52aDS7-2a3taMwd_XVLY9jGijCZLGrZW-zrznbi8ZFmypMBp8_goZkxJEcam6vIHoFNgYeWh27MLskxQ204Q27w-HjxCga1f1i69EoJpSivl7oLiX5ZVyUtI6DahP1tEC3d_pdYYAH3t8iLTVvan0HqQwzJyAMPbVEikXxr_xFOYut1kdY6jlqUwL7yHuHMGeQNnJ8Dw94CuMS_D8uF1FsOvABXX4hddhi16vq_AFVmyK3r4M0sTYfsnIJ2jAKhPwrOfA37fxVoX5fhhRNhC5P2fGT0YQGGyLK9qh5lLxP85zNHGNNHefeOapvjqdfmRnT-SM31Ot6V6M5TO-rbdJE5YS3sKxmszmhz-0aPzujWXmgAYXpcyj2W37cBJR6cJkCzgZTK5agjVZM3tbyiK6MXaym8-Iyqi7trqHYSouGmB6PqFe3dGkLXJz5B6bhv6H12UsWoZhLJpp7ZYdIP8S45mfyzSx9ei1YCy2JeP1hZR9c2Rv6DR0tIzWlh5rktuCAIIQgSLUyfttknoJtjjDU-h1N1452hpYon_fNN_K_pZgF_qaizFqR5B2_aS_Ic4INJcajP1gDsClTrKVMQBRvVjyyrhic2olineuXYRfL041bS8PfUFI-Ybdq94eeS-Ccfpfi3OmWCMD1eI8QHa6K7_rKfTLine truncated
-H 'oai-device-id: 7c216860-5b73-4e63-983f-142dbcae1809' \
-H 'origin: https://sora.chatgpt.com' \
-H 'priority: u=1, i' \
@@ -73,4 +73,49 @@ curl 'https://sora.chatgpt.com/backend/nf/create' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36' \
--data-raw '{"kind":"video","prompt":"SpongeBob buys Ozemspic for Patrick. Patrick is offended. ","title":null,"orientation":"portrait","size":"small","n_frames":300,"inpaint_items":[],"remix_target_id":null,"cameo_ids":null,"cameo_replacements":null,"model":"sy_8","style_id":null,"audio_caption":null,"audio_transcript":null,"video_caption":null,"storyboard_id":null}'
--------------------------------------------
This one is portrait with an upload:
curl 'https://sora.chatgpt.com/backend/nf/create' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfWDh6WTZ2VzJwUTl0UjNkRTduSzFqTDVnSCIsImV4cCI6MTc2MDMwMDg4NSwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS9hdXRoIjp7InVzZXJfaWQiOiJ1c2VyLWhRNWZjMUFWN3ZOY1FMazJ5ZkVGRVVibyJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfSwiaWF0IjoxNzU5NDM2ODg1LCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6IjE1ZTU5NjYyLTIxOTYtNDE3MS05ODQwLWVlZmRkMTZkZWQzYSIsIm5iZiI6MTc1OTQzNjg4NSwicHdkX2F1dGhfdGltZSI6MTc1OTQzNjg4NDY3NCwic2NwIjpbIm9wZW5pZCIsImVtYWlsIiwicHJvZmlsZSIsIm9mZmxpbmVfYWNjZXNzIiwibW9kZWwucmVxdWVzdCIsIm1vZGVsLnJlYWQiLCJvcmdhbml6YXRpb24ucmVhZCIsIm9yZ2FuaXphdGlvbi53cml0ZSJdLCJzZXNzaW9uX2lkIjoiYXV0aHNlc3NfSU1TS1pmS0ZWMEh4R1I3eGhjNk5DVkRvIiwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMTY0NTkzMDAxOTg2MTk4ODg4MzYifQ.l2dQ26eSPCpKpGONFQACXSn-Rndp5ClfwWEAE1uB2eGECSbbn9-m_9zlA0yWnjqwjXYZ5pdWKbuTgWlDgDEwjsprp2OVFH6GIPVOAVKwSZzUWf8ywdpsQBcYIYTpNWGWTK7HytK3P4Xu5I--nZ4TMZI5_iFrXOb8eS-DOSzqm6DjWfiYRcm9qr4JRJokPsXXl1JnHVm0m9iI6xAgS95B0iPoWvfIHgihxWq5k3LdwM-rzIU2srKAZxjuyOnslHkakKZ5algVcxsDfKR4N8oIyNSoOeHPUKDiGnr-O-PqODbdAwqzo1JJP7Bmskc_5bx01pbi6bUQd5MPnT7qdEbIZexkYjUuV6qRCObmCWNV5WTJwVvdTZ9nBhQ2cp6wmAee3y4buQawtXlnhwNaYgkJtpOBgSYIKnTKPTKjMd1PigO57LgSrUPUHVyDVtZ_qBhIlw_PqAu_bFEfx9xyOiWp72KgyS89-32zeZzJcd6m85NsP_1clIe483GMl6wGYMhGxmJazM_twq28wrXwrI3vWnShhPA0qXLKYgFBT10z937OyNgmxXfNWRMB4OgkgXF5ylFHW0aN_ztu7H2NGx2jCIPn0QkAoc8bSjyW98Ybwn_adMiV4FkEeNLvc-KQf6DcULOYiKDYAZWVthpfc2yTAcJUtqmg9Gkw053xWObrRZ4' \
-H 'content-type: application/json' \
-b '__Host-next-auth.csrf-token=53557711393b5bb42525188b40374f5a2d88c6e62f40ffa7303a6855b7ed3abf%7C666b09f1d850c146bf75cb2ef458d273b49cdcc3536619a4748c8b6f213c7ae0; __Secure-next-auth.callback-url=https%3A%2F%2Fsora.com; _cfuvid=41MbomhrDEOwWq1PxwZypVaYzoaB.18Jvwv7pcEZwsE-1759436874191-0.0.1.1-604800000; oai-did=7c216860-5b73-4e63-983f-142dbcae1809; _cfuvid=3J0VKjFQbgG6Hrj6WpYA0qUMQ1FEb.Q6LBxmKcpfxyY-1759436879377-0.0.1.1-604800000; __cflb=0H28vBjUqcdJN5F5i8D8gyGbfU6KPdHGDRRtJ35LbY9; cf_clearance=VtQ4ot_ZfCAXJEGWvjonzG.xV6DrSHOGWbhWmiWNUtA-1759519104-1.2.1.1-PhEsvsV1mBfZoUys8.EThBNQBqAkVRtNpiz57hSczT.oyAJP8NBEFrlBygmzdUq6u7l6Ag9dPHqUJH8ollLB9WwDguprdMOdz8zIrLpoBYyCXbSr1VvCLfhRdw.HqFoIVZbeH5sCEAtDybF2li0jGNuCw7if6gq.FLOlTxK7gHYsYmhbeZQ4xpL3IKJ_Tts77iEtvK0KAYLiKhDTW8gQTiD_Hp3HzcpWprMAdsckOSY; cf_clearance=TBN0NGQ1ThMhU3POQycbqPeR4lnPB2CluCKm.oreexo-1759519106-1.2.1.1-MFXpszFtGlx5r_ku3haWAXTupuoopmUZy3z0mLv9K.A9zk7x_969bb4xPlxPqPzL614KMuUilMsurnNvMOaMySJgbfv.Wk0.OkM3cVW_wNzCC6MtAP2y2XMoYUzMR4m13vSKI_mXlzqZaa5Bnz2bbM2Va5PYc7sp0YQE3fjzneWr3j6EmgM2kLyJM5Hj4DfCyRZOOT7hdzhVjixNRHBqJxqfsvapE_.7EVCayqv5GJo; oai-sc=0gAAAAABo4CGCQgMb0CiCRJdr6IIZgYVx3dN5sLdIkNoErslKPupCZ6WXt0681-1XqD1jSdNXGYoUwPBGAOs-i1w6JcnyHTYLnusz5VnzLGVOKhP_WoiaSfI-UBHXwosweLq-hy9WR9ZFRpJyh8PkZ3KhY59RFz6x4bYqInLG2xMCFdoStLK3tNohkkbHiwptZ8hMOA_jbg1TehcFJEdj8w7ko7TE9MnClA; __Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..PpPHyqWPPAu6nMy5.YXCuB0cxVsmJsxcIsD0wnhuopcOOwuZko8qkEAM_GHqxX9NWuMlVLr0Zg6bCPu7lqG-pATgiTaog-uc4Ur2TflgUWk8iOYR21tNfqXZL-y2O9P-3GqPj8CWGzS9UasbZKK1R4P3ECJ1WfDzzZxsvxnh4blmfMBE9VCImG4A0PIvmIrm5-Bv_J1VypDxDfl28xYKtPASje6odBFzCGYvCLyw52RFqeiUz3aJWy_6x1137u1fpc7N7rF2pNQBVKG3qQz9t_kri6uckWQWnLQVZd0plx5izgSbC0vWao6-2flUQHvnr8dqXWqTHESi7yjcJTaEu4CUR-jxKXhTvpHReKNyjEIXqF89wZ-W6_FTpKMKhP9D9WTXUs6JWmIkjT0c8K97rjoPI8F3_GCUhrnpfX3jwEIcMkYXKVMN24frQUO5LosXK4gOD8yWAGDOQ3iWSHHafZNAkqEC7Pyb9Fvl6R-9VkZTajX9frQ5T_tM40Z4HgnwZQpGpffuyaLyMvu-TVRF5PUmkRkTN4ToxROjFYJLaCXpJ7AHoL_-kntnV3OgclXhoBPAYbJ2LOGltMT6QqUvDui7PGhtn_HJ9ZampVKxEboJx23JbKc4Jc65JSDJcFkOUJtMrmURjYAAKwfGs6hA6W4ieeT9LFrJzFk_CM6wz-djPGADSbvJ-I3lkkqSFeBQENR9C9j8pou3agkxgMjxYdQqCdobtfut8XWSFAImRnGMsZeXOlmeIa2M7VlbOZST2ZI3I-vBc3n7_nRwaFR8YvgoslYMymCvMOv9960HUPL88dLutEH9AYgVT91dVUXEmGBGkuZsBhDHwxVY2k1D1aJ5z4TIbx32yr3M1tDwr93V-15b-l8VoECNqrIxt6Ixugvqely1dfMaCIpNh6spqanDFdYCX7YC8raT9nB0ss_yL6AB3e060h1jw79a4PtT8vumJiSqPSE6SfX5B9fdNdSkYNuYO8c4T3XsJul5oBkjwx9haoiI5GuaIEuGzNJMnLd9QPfHMsPQMG0zj93N-5XgYtqWgAdcllJNntl3I9-vUn3yViTojCvcNo7cDuQXYFME5xKsHUuHPAOAPrXntq4CCqTwVJkr-oeTq1xE19Zx_yGR3Iv96mE5lPgpb4S3sV7Yo-yfdy3scVoxYNxFj8aCbFI6ec0lOy4O9NvMllelUdpugoV2lHg6doiFI6DMnBhhKpi4CES2qLcW-ijZ0bJyxYoQojWNU-SmBkocF5jMCkXkYROPswXBkHtrZza4dD7gNpc3wY_XGTEl7aSbJUwr-CXVqy4TGFyEY6Kz3fxkfdw7UwEXU25moGB9REOxasA9xCZBOANzPLOJbCIgmkwOVK1Qa2TlgruLzMWpL6Mwtx42wo0MPKDKBJSvhHtNns_BxyKxnPX6Zf23RPh0VlCnFGHjdtOAvRNbLz-Pn9ya6veMavf0LZXeV4zKecBlx7ZxwEGck2JSei116a-O2UrM7pjcBWr-uNYiuTJ26aXoeREvZnlgBvGwSqFHMU65F5xGHaXmh_OOxIQwamwplbJwfxOXVPJYyZlWEbSuiyUphLvIeUHSoupkmljEv3Ja66m31jQukP0Yflkb-v02Zf2oiWkZINFxixeFnRyEs_fP3sK0c4OX3ynHB0X0MvMb2RGduQ2i-9J721x4Dn_O89hdHJ0_x8U04p47BHRO-e2hWMvt0YvjSB0FFmfeDqB2PcmTQUUN6auAlkx2ipwCdLtS9MfYkdR90aBTRYZgZ5zAfGe2iYa4RY6HcVJ_izFw0RYmrX79EHCm67S9ed4XiGWCw6v_BMd806KLyYITsZmIDGB6CL3WSKX8IcKPogrRZ5V35aolFSGcyLZVQYnAQCaYi9lFhsVJAQLRbZuXmPL8gWekYut__Wco7yn8LBRDEV6ZS-ej3IxaKrxGtNITmtDuQVbFjrp7tmC9z_ws3-sYc_wStRt0cfW88sOMnzn7NGTlqaFZBGNw7uMownsUm9FYWp95eBqbZ3mb-YFKalVV7ny4Jqr4JMlcCPUAL0UvSiZz5zars-joTp4kVJUBxjv6miWeXcPKycgtKYJf1oqxJzhJqAEZpdoT4GMPJeti1Rws0FL4OG5L8j4h-hKJWZjk_gkGXHwGkUX-YU0eLP3c1zC-4UR0CSsISkQBlqdzzt-X9Dx1QC-pbqCF26QKbqv_KrsuvpXp89lLGmNtZTM2K5-3smRPnD2joA0lA6TLuJiEnwYHeMAz9hEg3XMqn6Bu3sdzsSO_jOQNwLjGCXIdr4212uoXZ001rssMAwa5hmgyUpy4L9Uc54ZRRG2BenObBUqYycnG1d4LFLHOK5XJSVpS2msHbrSa3J7FezL8eVSBP69bAYN6rhj4v4fkld5NW-6z8_RFyM4qACp6mABzwPMsDEWME7vaW7JSUrbIFsYVdvIgIKhNJAF33IxNOleRCNmQFG490YPbFvGtgd6C7pS4vlxjFiaDmIATLp5X0blTNQFp-8JykwgiRhysfTOe_hnrVX2cEeZMvwDF4ZAXyu6GEeRbsEXxDPhDawO4NHN-C1iaG6fZnR3Su2Cnyh2q1pgWSQwmgRYJdTLJCFpVTYMFVc3o92vndeWUMCJPmPGSMtsmcs5ZSVGMVDD5bTZ2B2j5-X1fWjtlpZttTCJbWCBQ86KDj5zHyumv0Y0U-Xc5j8aqexxEBQhzIiP6XQfNcClVcuRLXSfdGe8jubcDB6YBBB5kzaViDszYnbLTMC5buvdygPhZJHqWd2OVwzlDMyTxCje9bHhB5KKeb60VPJa6kDEL0s4iPnL01H17aJQgf-7WWQaSJzYLtiEq_ppR344OA85KXNMnF9A3AB5BJ1SAiO3I3a6LW9r12Vh9V5Bm13MjZ4VqefJ6vtuG2XPzyshyip-MlbFCwBgpmNMFLQvPSzQAJr9P_U-RZB3kFPLIWel58ktqd6L8BmapLPTV_N092_yTxoom5vt_O9ggwRcD_VgwgzNrWxXN9pOFpMmRVmcsAB-q57_WVpSSixnnANYGF1GxmkIZYAUUT7eWJxkrksh_yvlXlbYfAORFL9OXMd7rfm49_4GXIg_Ggo-S5WiQElztasMMc02ksbHEIDzRfRTqeU9Qs_e5fyu8UjpUR0HFOZVXMhuDsfSRm-CveZ04fki_qhvyq4tia27p5W9BnC-k6sx8pE__IbLProTbI7c8DP3pnBIiswRuzP568wvBcxrK98vn0Z3yz2a1wNHMKwfe6Wq1TNKwWD6-9B7HkpNGfKohipCigf4tC8iijnuInFbxLXdTtcg3eoulbFqVpqjdqEGOaHwKnIbKdrx9zySqXIlQwTwgJiTJd3YGLVlfU7F4YH00tNfJDqC_UBr1P9REUnQiZFkJ2q2EtSVm2uLu3QWq2EOrN1pFBjvRJcF5zaDghMd5gYgmx6PLvVLr7_ug3t-uMDDplFHT1xzeOyqZQPUy7uFJAtF8RWECcEfHBEbVNak3b-olD0ueJmuY3e_GDn0uvgtLHDCK6TtKYBBQ79TAYrx7OyjHM3ce5XMEjGkvMNxRztb59oFKh.N72spCLine truncated
-H 'oai-device-id: 7c216860-5b73-4e63-983f-142dbcae1809' \
-H 'origin: https://sora.chatgpt.com' \
-H 'priority: u=1, i' \
-H 'referer: https://sora.chatgpt.com/explore' \
-H 'sec-ch-ua: "Chromium";v="140", "Not=A?Brand";v="24", "Google Chrome";v="140"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36' \
--data-raw '{"kind":"video","prompt":"A quaint village town in a fantasy setting. The camera pulls back to show the village. ","title":null,"orientation":"landscape","size":"small","n_frames":300,"inpaint_items":[{"kind":"upload","upload_id":"media_01k6nscysdfxktrvshw0qmkmv3"}],"remix_target_id":null,"cameo_ids":null,"cameo_replacements":null,"model":"sy_8","style_id":null,"audio_caption":null,"audio_transcript":null,"video_caption":null,"storyboard_id":null}'
{
"kind":"video",
"prompt":"A quaint village",
"title":null,
"orientation":"landscape",
"size":"small",
"n_frames":300,
"inpaint_items":[
{
"kind":"upload",
"upload_id":"media_01k6nscysdfxktrvshw0qmkmv3"
}
],
"remix_target_id":null,
"cameo_ids":null,
"cameo_replacements":null,
"model":"sy_8",
"style_id":null,
"audio_caption":null,
"audio_transcript":null,
"video_caption":null,
"storyboard_id":null}'
@@ -11,7 +11,7 @@ use serde_derive::Deserialize;
use url::Url;
use wreq::Client;
const SORA_LIST_TASKS_URL : &str = "https://sora.chatgpt.com/backend/v2/list_tasks?limit=20";
const SORA_LIST_CLASSIC_TASKS_URL: &str = "https://sora.chatgpt.com/backend/v2/list_tasks?limit=20";
/// NB: We omit fields we're not using to prevent breakage.
@@ -74,7 +74,7 @@ pub struct PartialGeneration {
// ... lots of other fields ...
}
pub async fn list_tasks(credentials: &SoraCredentialSet) -> Result<ListTasksResponse, SoraError> {
pub async fn list_classic_tasks(credentials: &SoraCredentialSet) -> Result<ListTasksResponse, SoraError> {
let bearer_header = match credentials.jwt_bearer_token.as_ref() {
Some(bearer) => bearer.to_authorization_header_value(),
@@ -86,7 +86,7 @@ pub async fn list_tasks(credentials: &SoraCredentialSet) -> Result<ListTasksResp
let client = Client::new();
let mut url = Url::parse(SORA_LIST_TASKS_URL)
let mut url = Url::parse(SORA_LIST_CLASSIC_TASKS_URL)
.map_err(|err| {
SoraClientError::UrlParseError(err)
})?;
@@ -147,7 +147,7 @@ pub async fn list_tasks(credentials: &SoraCredentialSet) -> Result<ListTasksResp
#[cfg(test)]
mod tests {
use crate::requests::list_tasks::list_tasks::list_tasks;
use crate::requests::list_classic_tasks::list_classic_tasks::list_classic_tasks;
use crate::test_utils::get_test_credentials::get_test_credentials;
use errors::AnyhowResult;
@@ -155,9 +155,9 @@ mod tests {
#[tokio::test]
pub async fn manual_test() -> AnyhowResult<()> {
let creds = get_test_credentials()?;
let result = list_tasks(&creds).await?;
let result = list_classic_tasks(&creds).await?;
println!("result: {:#?}", result);
assert_eq!(1, 2);
Ok(())
}
}
}
@@ -0,0 +1 @@
pub mod list_classic_tasks;
@@ -0,0 +1,51 @@
use serde_derive::Deserialize;
#[derive(Deserialize)]
pub (super) struct HttpDraftsResponse {
pub items: Vec<PartialItem>,
// NB: This is nullable.
// It's null in my tests, so I don't know if this is a string or integer yet. Probably an opaque string?
//pub cursor: Option<String>,
}
#[derive(Deserialize)]
pub (super) struct PartialItem {
// eg. "gen_01abc..."
pub id: String,
pub task_id: String,
//pub generation_id: String, // it looks like this matches "id" for now
// The text prompt
pub prompt: String,
// URL to the generation
pub url: String,
// "downloadable" URL to the generation
// it looks like this matches "url" for now
pub downloadable_url: String,
/// If there was a content violation, this will describe why.
pub reason_str: Option<String>,
// There are other things that might be interesting: "encodings", "width", "height", etc.
}
#[derive(Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DraftKind {
/// Video
SoraDraft,
/// Video was blocked due to content
/// These failures will have different "reason_str" reasons.
SoraContentViolation,
/// Unknown type.
#[serde(untagged)]
Unknown(String),
}
@@ -0,0 +1,144 @@
use crate::constants::user_agent::USER_AGENT;
use crate::creds::sora_credential_set::SoraCredentialSet;
use crate::error::sora_client_error::SoraClientError;
use crate::error::sora_error::SoraError;
use crate::error::sora_generic_api_error::SoraGenericApiError;
use crate::requests::common::task_id::TaskId;
use crate::requests::deprecated::job_status::sora_job_status::{Generation, StatusRequest, VideoGenStatusResponse};
use crate::requests::list_sora2_drafts::http_response::HttpDraftsResponse;
use crate::utils_internal::classify_general_http_status_code_and_body::classify_general_http_status_code_and_body;
use log::{debug, error, info, warn};
use serde_derive::Deserialize;
use url::Url;
use wreq::header::{ACCEPT, ACCEPT_LANGUAGE, AUTHORIZATION, CONTENT_TYPE, COOKIE, ORIGIN, REFERER};
use wreq::Client;
const SORA_LIST_DRAFTS_URL: &str = "https://sora.chatgpt.com/backend/project_y/profile/drafts?limit=15";
/// NB: We omit fields we're not using to prevent breakage.
#[derive(Clone, Debug)]
pub struct ListSora2DraftsResponse {
pub drafts: Vec<Draft>,
}
#[derive(Clone, Debug)]
pub struct Draft {
pub id: String,
pub task_id: TaskId,
pub url: String,
pub prompt: String,
}
pub async fn list_sora2_drafts(credentials: &SoraCredentialSet) -> Result<ListSora2DraftsResponse, SoraError> {
let client = Client::new();
let authorization_header = credentials.jwt_bearer_token.as_ref()
.ok_or(SoraClientError::NoBearerTokenForRequest)?
.to_authorization_header_value();
let cookie = credentials.cookies.to_string();
// TODO: Make the sec-* headers match the user agent and platform
// TODO: device id
//-H 'oai-device-id: 7c216860-5b73-4e63-983f-142dbcae1809' \
let mut http_request = client.get(SORA_LIST_DRAFTS_URL)
//.header("OpenAI-Sentinel-Token", &sentinel);
.header(ACCEPT, "*/*")
.header(REFERER, "https://sora.chatgpt.com/drafts")
.header(ACCEPT_LANGUAGE, "en-US,en;q=0.9")
.header(wreq::header::USER_AGENT, USER_AGENT)
.header(COOKIE, &cookie)
.header(AUTHORIZATION, &authorization_header)
.header("priority", "u=1, i")
.header("sec-ch-ua", "\"Chromium\";v=\"140\", \"Not=A?Brand\";v=\"24\", \"Google Chrome\";v=\"140\"")
.header("sec-ch-ua-mobile", "?0")
.header("sec-ch-ua-platform", "macOS")
.header("sec-fetch-dest", "empty")
.header("sec-fetch-mode", "cors")
.header("sec-fetch-site", "same-origin");
//if let Some(timeout) = args.request_timeout {
// http_request = http_request.timeout(timeout);
//}
let http_request = http_request.build()
.map_err(|err| {
error!("Error building Sora 2 list drafts HTTP request: {:?}", err);
SoraClientError::WreqClientError(err)
})?;
let response = client.execute(http_request)
.await
.map_err(|err| {
error!("Error during Sora 2 list drafts request: {:?}", err);
SoraClientError::WreqClientError(err)
})?;
let status = response.status();
let response_body = &response.text().await
.map_err(|err| {
error!("Error reading Sora 2 list drafts response body: {:?}", err);
SoraClientError::WreqClientError(err)
})?;
println!("Sora 2 list drafts response : {:?}", response_body);
println!("response : {}", response_body);
if !status.is_success() {
error!("Sora list drafts request returned an error (code {}) : {:?}", status.as_u16(), response_body);
// TODO: Categorize failures.
// error!("The sora task list request failed; status = {:?} ; response body = {}", status, response_body);
// let error = classify_general_http_status_code_and_body(status, &response_body).await;
// return Err(error);
return Err(SoraGenericApiError::UncategorizedBadResponseWithStatusAndBody {
status_code: status,
body: response_body.to_string(),
}.into());
}
let response : HttpDraftsResponse = serde_json::from_str(response_body)
.map_err(|err| SoraGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
Ok(ListSora2DraftsResponse {
drafts: response.items
.into_iter()
.map(|draft| Draft {
id: draft.id,
task_id: TaskId::from_string(draft.task_id),
url: draft.url,
prompt: draft.prompt,
}).collect(),
})
}
/*
Error: SoraGenericApiError: UncategorizedBadResponseWithStatusAndBody { status_code: 400,
body: "{\n \"error\": {\n \"message\": \"
[{'type': 'missing', 'loc': ('body',), 'msg': 'Field required', 'input': None}]\",\n
\"type\": \"invalid_request_error\",\n \"param\": null,\n \"code\": null\n }\n}" }
*/
#[cfg(test)]
mod tests {
use crate::requests::list_classic_tasks::list_classic_tasks::list_classic_tasks;
use crate::test_utils::get_test_credentials::get_test_credentials;
use errors::AnyhowResult;
use crate::requests::list_sora2_drafts::list_sora2_drafts::list_sora2_drafts;
#[ignore] // You can manually run "ignore" tests in the IDE, but they won't run in CI.
#[tokio::test]
pub async fn manual_test() -> AnyhowResult<()> {
let creds = get_test_credentials()?;
let result = list_sora2_drafts(&creds).await?;
println!("result: {:#?}", result);
assert_eq!(1, 2);
Ok(())
}
}
@@ -0,0 +1,2 @@
pub mod list_sora2_drafts;
pub (super) mod http_response;
@@ -1,3 +1,6 @@
We might not need this request - it's only for in-progres items.
It could be useful to show the progress bar, but the items disappear once done.
curl 'https://sora.chatgpt.com/backend/nf/pending' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
@@ -12,4 +15,5 @@ curl 'https://sora.chatgpt.com/backend/nf/pending' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36'
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36'
@@ -1 +0,0 @@
pub mod list_tasks;
@@ -4,6 +4,7 @@ pub mod common;
pub mod deprecated;
pub mod generate_sora2_video;
pub mod image_gen;
pub mod list_sora2_tasks;
pub mod list_tasks;
pub mod upload;
pub mod list_classic_tasks;
pub mod list_sora2_drafts;
pub mod upload;
pub mod upload_sora2;
@@ -0,0 +1,21 @@
This may be the same upload request as before, just with an updated subdomain/domain:
curl 'https://sora.chatgpt.com/backend/uploads' \
-H 'accept: */*' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfWDh6WTZ2VzJwUTl0UjNkRTduSzFqTDVnSCIsImV4cCI6MTc2MDMwMDg4NSwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS9hdXRoIjp7InVzZXJfaWQiOiJ1c2VyLWhRNWZjMUFWN3ZOY1FMazJ5ZkVGRVVibyJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJ2aWN0b3J2b2ljZTg5QGdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfSwiaWF0IjoxNzU5NDM2ODg1LCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6IjE1ZTU5NjYyLTIxOTYtNDE3MS05ODQwLWVlZmRkMTZkZWQzYSIsIm5iZiI6MTc1OTQzNjg4NSwicHdkX2F1dGhfdGltZSI6MTc1OTQzNjg4NDY3NCwic2NwIjpbIm9wZW5pZCIsImVtYWlsIiwicHJvZmlsZSIsIm9mZmxpbmVfYWNjZXNzIiwibW9kZWwucmVxdWVzdCIsIm1vZGVsLnJlYWQiLCJvcmdhbml6YXRpb24ucmVhZCIsIm9yZ2FuaXphdGlvbi53cml0ZSJdLCJzZXNzaW9uX2lkIjoiYXV0aHNlc3NfSU1TS1pmS0ZWMEh4R1I3eGhjNk5DVkRvIiwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMTY0NTkzMDAxOTg2MTk4ODg4MzYifQ.l2dQ26eSPCpKpGONFQACXSn-Rndp5ClfwWEAE1uB2eGECSbbn9-m_9zlA0yWnjqwjXYZ5pdWKbuTgWlDgDEwjsprp2OVFH6GIPVOAVKwSZzUWf8ywdpsQBcYIYTpNWGWTK7HytK3P4Xu5I--nZ4TMZI5_iFrXOb8eS-DOSzqm6DjWfiYRcm9qr4JRJokPsXXl1JnHVm0m9iI6xAgS95B0iPoWvfIHgihxWq5k3LdwM-rzIU2srKAZxjuyOnslHkakKZ5algVcxsDfKR4N8oIyNSoOeHPUKDiGnr-O-PqODbdAwqzo1JJP7Bmskc_5bx01pbi6bUQd5MPnT7qdEbIZexkYjUuV6qRCObmCWNV5WTJwVvdTZ9nBhQ2cp6wmAee3y4buQawtXlnhwNaYgkJtpOBgSYIKnTKPTKjMd1PigO57LgSrUPUHVyDVtZ_qBhIlw_PqAu_bFEfx9xyOiWp72KgyS89-32zeZzJcd6m85NsP_1clIe483GMl6wGYMhGxmJazM_twq28wrXwrI3vWnShhPA0qXLKYgFBT10z937OyNgmxXfNWRMB4OgkgXF5ylFHW0aN_ztu7H2NGx2jCIPn0QkAoc8bSjyW98Ybwn_adMiV4FkEeNLvc-KQf6DcULOYiKDYAZWVthpfc2yTAcJUtqmg9Gkw053xWObrRZ4' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary9881wW70TIkcu38b' \
-b '__Host-next-auth.csrf-token=53557711393b5bb42525188b40374f5a2d88c6e62f40ffa7303a6855b7ed3abf%7C666b09f1d850c146bf75cb2ef458d273b49cdcc3536619a4748c8b6f213c7ae0; __Secure-next-auth.callback-url=https%3A%2F%2Fsora.com; _cfuvid=41MbomhrDEOwWq1PxwZypVaYzoaB.18Jvwv7pcEZwsE-1759436874191-0.0.1.1-604800000; oai-did=7c216860-5b73-4e63-983f-142dbcae1809; _cfuvid=3J0VKjFQbgG6Hrj6WpYA0qUMQ1FEb.Q6LBxmKcpfxyY-1759436879377-0.0.1.1-604800000; __cflb=0H28vBjUqcdJN5F5i8D8gyGbfU6KPdHGDRRtJ35LbY9; cf_clearance=VtQ4ot_ZfCAXJEGWvjonzG.xV6DrSHOGWbhWmiWNUtA-1759519104-1.2.1.1-PhEsvsV1mBfZoUys8.EThBNQBqAkVRtNpiz57hSczT.oyAJP8NBEFrlBygmzdUq6u7l6Ag9dPHqUJH8ollLB9WwDguprdMOdz8zIrLpoBYyCXbSr1VvCLfhRdw.HqFoIVZbeH5sCEAtDybF2li0jGNuCw7if6gq.FLOlTxK7gHYsYmhbeZQ4xpL3IKJ_Tts77iEtvK0KAYLiKhDTW8gQTiD_Hp3HzcpWprMAdsckOSY; cf_clearance=TBN0NGQ1ThMhU3POQycbqPeR4lnPB2CluCKm.oreexo-1759519106-1.2.1.1-MFXpszFtGlx5r_ku3haWAXTupuoopmUZy3z0mLv9K.A9zk7x_969bb4xPlxPqPzL614KMuUilMsurnNvMOaMySJgbfv.Wk0.OkM3cVW_wNzCC6MtAP2y2XMoYUzMR4m13vSKI_mXlzqZaa5Bnz2bbM2Va5PYc7sp0YQE3fjzneWr3j6EmgM2kLyJM5Hj4DfCyRZOOT7hdzhVjixNRHBqJxqfsvapE_.7EVCayqv5GJo; oai-sc=0gAAAAABo4CGCQgMb0CiCRJdr6IIZgYVx3dN5sLdIkNoErslKPupCZ6WXt0681-1XqD1jSdNXGYoUwPBGAOs-i1w6JcnyHTYLnusz5VnzLGVOKhP_WoiaSfI-UBHXwosweLq-hy9WR9ZFRpJyh8PkZ3KhY59RFz6x4bYqInLG2xMCFdoStLK3tNohkkbHiwptZ8hMOA_jbg1TehcFJEdj8w7ko7TE9MnClA; __Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..PpPHyqWPPAu6nMy5.YXCuB0cxVsmJsxcIsD0wnhuopcOOwuZko8qkEAM_GHqxX9NWuMlVLr0Zg6bCPu7lqG-pATgiTaog-uc4Ur2TflgUWk8iOYR21tNfqXZL-y2O9P-3GqPj8CWGzS9UasbZKK1R4P3ECJ1WfDzzZxsvxnh4blmfMBE9VCImG4A0PIvmIrm5-Bv_J1VypDxDfl28xYKtPASje6odBFzCGYvCLyw52RFqeiUz3aJWy_6x1137u1fpc7N7rF2pNQBVKG3qQz9t_kri6uckWQWnLQVZd0plx5izgSbC0vWao6-2flUQHvnr8dqXWqTHESi7yjcJTaEu4CUR-jxKXhTvpHReKNyjEIXqF89wZ-W6_FTpKMKhP9D9WTXUs6JWmIkjT0c8K97rjoPI8F3_GCUhrnpfX3jwEIcMkYXKVMN24frQUO5LosXK4gOD8yWAGDOQ3iWSHHafZNAkqEC7Pyb9Fvl6R-9VkZTajX9frQ5T_tM40Z4HgnwZQpGpffuyaLyMvu-TVRF5PUmkRkTN4ToxROjFYJLaCXpJ7AHoL_-kntnV3OgclXhoBPAYbJ2LOGltMT6QqUvDui7PGhtn_HJ9ZampVKxEboJx23JbKc4Jc65JSDJcFkOUJtMrmURjYAAKwfGs6hA6W4ieeT9LFrJzFk_CM6wz-djPGADSbvJ-I3lkkqSFeBQENR9C9j8pou3agkxgMjxYdQqCdobtfut8XWSFAImRnGMsZeXOlmeIa2M7VlbOZST2ZI3I-vBc3n7_nRwaFR8YvgoslYMymCvMOv9960HUPL88dLutEH9AYgVT91dVUXEmGBGkuZsBhDHwxVY2k1D1aJ5z4TIbx32yr3M1tDwr93V-15b-l8VoECNqrIxt6Ixugvqely1dfMaCIpNh6spqanDFdYCX7YC8raT9nB0ss_yL6AB3e060h1jw79a4PtT8vumJiSqPSE6SfX5B9fdNdSkYNuYO8c4T3XsJul5oBkjwx9haoiI5GuaIEuGzNJMnLd9QPfHMsPQMG0zj93N-5XgYtqWgAdcllJNntl3I9-vUn3yViTojCvcNo7cDuQXYFME5xKsHUuHPAOAPrXntq4CCqTwVJkr-oeTq1xE19Zx_yGR3Iv96mE5lPgpb4S3sV7Yo-yfdy3scVoxYNxFj8aCbFI6ec0lOy4O9NvMllelUdpugoV2lHg6doiFI6DMnBhhKpi4CES2qLcW-ijZ0bJyxYoQojWNU-SmBkocF5jMCkXkYROPswXBkHtrZza4dD7gNpc3wY_XGTEl7aSbJUwr-CXVqy4TGFyEY6Kz3fxkfdw7UwEXU25moGB9REOxasA9xCZBOANzPLOJbCIgmkwOVK1Qa2TlgruLzMWpL6Mwtx42wo0MPKDKBJSvhHtNns_BxyKxnPX6Zf23RPh0VlCnFGHjdtOAvRNbLz-Pn9ya6veMavf0LZXeV4zKecBlx7ZxwEGck2JSei116a-O2UrM7pjcBWr-uNYiuTJ26aXoeREvZnlgBvGwSqFHMU65F5xGHaXmh_OOxIQwamwplbJwfxOXVPJYyZlWEbSuiyUphLvIeUHSoupkmljEv3Ja66m31jQukP0Yflkb-v02Zf2oiWkZINFxixeFnRyEs_fP3sK0c4OX3ynHB0X0MvMb2RGduQ2i-9J721x4Dn_O89hdHJ0_x8U04p47BHRO-e2hWMvt0YvjSB0FFmfeDqB2PcmTQUUN6auAlkx2ipwCdLtS9MfYkdR90aBTRYZgZ5zAfGe2iYa4RY6HcVJ_izFw0RYmrX79EHCm67S9ed4XiGWCw6v_BMd806KLyYITsZmIDGB6CL3WSKX8IcKPogrRZ5V35aolFSGcyLZVQYnAQCaYi9lFhsVJAQLRbZuXmPL8gWekYut__Wco7yn8LBRDEV6ZS-ej3IxaKrxGtNITmtDuQVbFjrp7tmC9z_ws3-sYc_wStRt0cfW88sOMnzn7NGTlqaFZBGNw7uMownsUm9FYWp95eBqbZ3mb-YFKalVV7ny4Jqr4JMlcCPUAL0UvSiZz5zars-joTp4kVJUBxjv6miWeXcPKycgtKYJf1oqxJzhJqAEZpdoT4GMPJeti1Rws0FL4OG5L8j4h-hKJWZjk_gkGXHwGkUX-YU0eLP3c1zC-4UR0CSsISkQBlqdzzt-X9Dx1QC-pbqCF26QKbqv_KrsuvpXp89lLGmNtZTM2K5-3smRPnD2joA0lA6TLuJiEnwYHeMAz9hEg3XMqn6Bu3sdzsSO_jOQNwLjGCXIdr4212uoXZ001rssMAwa5hmgyUpy4L9Uc54ZRRG2BenObBUqYycnG1d4LFLHOK5XJSVpS2msHbrSa3J7FezL8eVSBP69bAYN6rhj4v4fkld5NW-6z8_RFyM4qACp6mABzwPMsDEWME7vaW7JSUrbIFsYVdvIgIKhNJAF33IxNOleRCNmQFG490YPbFvGtgd6C7pS4vlxjFiaDmIATLp5X0blTNQFp-8JykwgiRhysfTOe_hnrVX2cEeZMvwDF4ZAXyu6GEeRbsEXxDPhDawO4NHN-C1iaG6fZnR3Su2Cnyh2q1pgWSQwmgRYJdTLJCFpVTYMFVc3o92vndeWUMCJPmPGSMtsmcs5ZSVGMVDD5bTZ2B2j5-X1fWjtlpZttTCJbWCBQ86KDj5zHyumv0Y0U-Xc5j8aqexxEBQhzIiP6XQfNcClVcuRLXSfdGe8jubcDB6YBBB5kzaViDszYnbLTMC5buvdygPhZJHqWd2OVwzlDMyTxCje9bHhB5KKeb60VPJa6kDEL0s4iPnL01H17aJQgf-7WWQaSJzYLtiEq_ppR344OA85KXNMnF9A3AB5BJ1SAiO3I3a6LW9r12Vh9V5Bm13MjZ4VqefJ6vtuG2XPzyshyip-MlbFCwBgpmNMFLQvPSzQAJr9P_U-RZB3kFPLIWel58ktqd6L8BmapLPTV_N092_yTxoom5vt_O9ggwRcD_VgwgzNrWxXN9pOFpMmRVmcsAB-q57_WVpSSixnnANYGF1GxmkIZYAUUT7eWJxkrksh_yvlXlbYfAORFL9OXMd7rfm49_4GXIg_Ggo-S5WiQElztasMMc02ksbHEIDzRfRTqeU9Qs_e5fyu8UjpUR0HFOZVXMhuDsfSRm-CveZ04fki_qhvyq4tia27p5W9BnC-k6sx8pE__IbLProTbI7c8DP3pnBIiswRuzP568wvBcxrK98vn0Z3yz2a1wNHMKwfe6Wq1TNKwWD6-9B7HkpNGfKohipCigf4tC8iijnuInFbxLXdTtcg3eoulbFqVpqjdqEGOaHwKnIbKdrx9zySqXIlQwTwgJiTJd3YGLVlfU7F4YH00tNfJDqC_UBr1P9REUnQiZFkJ2q2EtSVm2uLu3QWq2EOrN1pFBjvRJcF5zaDghMd5gYgmx6PLvVLr7_ug3t-uMDDplFHT1xzeOyqZQPUy7uFJAtF8RWECcEfHBEbVNak3b-olD0ueJmuY3e_GDn0uvgtLHDCK6TtKYBBQ79TAYrx7OyjHM3ce5XMEjGkvMNxRztb59oFKh.N72spCLine truncated
-H 'oai-device-id: 7c216860-5b73-4e63-983f-142dbcae1809' \
-H 'origin: https://sora.chatgpt.com' \
-H 'priority: u=1, i' \
-H 'referer: https://sora.chatgpt.com/explore' \
-H 'sec-ch-ua: "Chromium";v="140", "Not=A?Brand";v="24", "Google Chrome";v="140"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36' \
--data-raw $'------WebKitFormBoundary9881wW70TIkcu38b\r\nContent-Disposition: form-data; name="file"; filename="artcraft_kscc8n1yj6tyqcxm5btfp32v9b412kz9.png"\r\nContent-Type: image/png\r\n\r\n\r\n------WebKitFormBoundary9881wW70TIkcu38b\r\nContent-Disposition: form-data; name="file_name"\r\n\r\nartcraft_kscc8n1yj6tyqcxm5btfp32v9b412kz9.png\r\n------WebKitFormBoundary9881wW70TIkcu38b--\r\n'
@@ -0,0 +1,15 @@
{
"id": "media_01k6nscysdfxktrvshw0qmkmv3",
"type": "image",
"created_at": "2025-10-03T19:39:49.938416Z",
"filename": "artcraft_kscc8n1yj6tyqcxm5btfp32v9b412kz9.png",
"extension": "png",
"mime_type": "image/png",
"url": "https://videos.openai.com/vg-assets/assets%2Fclient_upload%2Fmedia%2F984cd7658c4eeb0be057d5d91c4faf3d2e5fd579%2Fmedia_01k6nscysdfxktrvshw0qmkmv3.png?st=2025-10-03T18%3A03%3A28Z&se=2025-10-09T19%3A03%3A28Z&sks=b&skt=2025-10-03T18%3A03%3A28Z&ske=2025-10-09T19%3A03%3A28Z&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skoid=aa5ddad1-c91a-4f0a-9aca-e20682cc8969&skv=2019-02-02&sv=2018-11-09&sr=b&sp=r&spr=https%2Chttp&sig=bUkwbc6pZTrGs4YiV9Q6I%2FwP7JPgtexoyvC5b2Aa6CE%3D&az=oaivgprodscus",
"width": 1248,
"height": 832,
"duration_sec": null,
"n_frames": 1,
"size_bytes": 2278064,
"thumbnail_url": "https://videos.openai.com/vg-assets/assets%2Fclient_upload%2Fmedia%2F984cd7658c4eeb0be057d5d91c4faf3d2e5fd579%2Fmedia_01k6nscysdfxktrvshw0qmkmv3.jpg?st=2025-10-03T18%3A03%3A28Z&se=2025-10-09T19%3A03%3A28Z&sks=b&skt=2025-10-03T18%3A03%3A28Z&ske=2025-10-09T19%3A03%3A28Z&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skoid=aa5ddad1-c91a-4f0a-9aca-e20682cc8969&skv=2019-02-02&sv=2018-11-09&sr=b&sp=r&spr=https%2Chttp&sig=XhdbsZRUv0OiVGHf%2Fc9YWCDhWBqXy5YzqO32ahqKc1E%3D&az=oaivgprodscus"
}
@@ -3,7 +3,7 @@ use chrono::{TimeDelta, Utc};
use errors::AnyhowResult;
use log::{error, info};
use openai_sora_client::recipes::maybe_upgrade_or_renew_session::maybe_upgrade_or_renew_session;
use openai_sora_client::requests::list_tasks::list_tasks::list_tasks;
use openai_sora_client::requests::list_tasks::list_classic_tasks::list_tasks;
use serde_derive::Serialize;
use std::ops::Add;
use tauri::{AppHandle, State};
@@ -9,7 +9,7 @@ use enums::tauri::tasks::task_status;
use errors::AnyhowResult;
use log::info;
use openai_sora_client::requests::common::task_id::TaskId;
use openai_sora_client::requests::list_tasks::list_tasks::PartialTaskResponse;
use openai_sora_client::requests::list_tasks::list_classic_tasks::PartialTaskResponse;
use sqlite_tasks::queries::list_tasks_by_provider_and_status::Task;
use sqlite_tasks::queries::update_task_status::{update_task_status, UpdateTaskArgs};
use std::collections::HashMap;
@@ -20,9 +20,9 @@ use idempotency::uuid::generate_random_uuid;
use log::{error, info};
use once_cell::sync::Lazy;
use openai_sora_client::creds::sora_credential_set::SoraCredentialSet;
use openai_sora_client::recipes::list_sora_tasks_with_session_auto_renew::list_sora_tasks_with_session_auto_renew;
use openai_sora_client::recipes::list_classic_sora_tasks_with_session_auto_renew::list_classic_sora_tasks_with_session_auto_renew;
use openai_sora_client::requests::common::task_id::TaskId;
use openai_sora_client::requests::list_tasks::list_tasks::{PartialGeneration, PartialTaskResponse};
use openai_sora_client::requests::list_tasks::list_classic_tasks::{PartialGeneration, PartialTaskResponse};
use reqwest::Url;
use sqlite_tasks::queries::list_tasks_by_provider_and_status::{list_tasks_by_provider_and_status, ListTasksByProviderAndStatusArgs, Task, TaskList};
use sqlite_tasks::queries::update_task_status::{update_task_status, UpdateTaskArgs};
@@ -22,9 +22,9 @@ use idempotency::uuid::generate_random_uuid;
use log::{error, info, warn};
use once_cell::sync::Lazy;
use openai_sora_client::creds::sora_credential_set::SoraCredentialSet;
use openai_sora_client::recipes::list_sora_tasks_with_session_auto_renew::list_sora_tasks_with_session_auto_renew;
use openai_sora_client::recipes::list_classic_sora_tasks_with_session_auto_renew::list_classic_sora_tasks_with_session_auto_renew;
use openai_sora_client::requests::common::task_id::TaskId;
use openai_sora_client::requests::list_tasks::list_tasks::TaskStatus;
use openai_sora_client::requests::list_tasks::list_classic_tasks::TaskStatus;
use reqwest::Url;
use sqlite_tasks::queries::list_tasks_by_provider_and_status::{list_tasks_by_provider_and_status, ListTasksByProviderAndStatusArgs, Task, TaskList};
use sqlite_tasks::queries::update_task_status::{update_task_status, UpdateTaskArgs};
@@ -129,7 +129,7 @@ async fn poll_sora_tasks(
.collect::<HashMap<String, Task>>();
let (sora_response, maybe_new_creds) =
list_sora_tasks_with_session_auto_renew(&sora_creds).await?;
list_classic_sora_tasks_with_session_auto_renew(&sora_creds).await?;
if let Some(new_creds) = maybe_new_creds {
info!("Saving new credentials.");