feat(DM+SdDDL): sequential full-season download queue, fix close crash, return true
- DM: add dl_missing_* fields to AppCtx for sequential queue - DM player: count_missing_in_season, find_next_missing, download_episode, download_missing_season_start/next - DM main onResult: auto-continue queue when dl_missing_active, updates status DL X/Y, finishes with done ok/fail - SdDownloader: file exists returns true (Already on SD) with total=file size, not false - SdDownloader: set_result_and_close minimal bundle (only success bool) to avoid internal heap OOM crash on close - SdDownloader: Cancel button becomes Close after done, calls tt_app_stop() directly (manual close per request, auto-close unreliable) - Fixes crash on close observed in demo mode (file exists) and after download done Tested on 192.168.68.133: SdDownloader shows Already on SD + Close, DM shows S10 5/6 after sequential, no crash on open/close cycles
This commit is contained in:
@@ -297,6 +297,55 @@ static void onResult(AppHandle app, void* data, AppLaunchId launchId, AppResult
|
||||
save_state();
|
||||
ui_rebuild_episode_list();
|
||||
|
||||
// Handle sequential full-season download queue (safe single-file mode)
|
||||
if(G.dl_missing_active){
|
||||
if(success) G.dl_missing_done++;
|
||||
else G.dl_missing_failed++;
|
||||
|
||||
int next = find_next_missing_in_season(G.dl_missing_season);
|
||||
if(next!=-1){
|
||||
ESP_LOGI(TAG, "Batch queue continuing: %d/%d done, next idx %d", G.dl_missing_done, G.dl_missing_total, next);
|
||||
tt_lvgl_lock(portMAX_DELAY);
|
||||
if(G.lbl_status){
|
||||
char msg[64];
|
||||
snprintf(msg,sizeof(msg),"DL %d/%d S%02d...", G.dl_missing_done+1, G.dl_missing_total, G.dl_missing_season);
|
||||
lv_label_set_text(G.lbl_status, msg);
|
||||
}
|
||||
tt_lvgl_unlock();
|
||||
// Small delay to let UI update before launching next downloader
|
||||
vTaskDelay(pdMS_TO_TICKS(300));
|
||||
if(download_episode(next)){
|
||||
// started next
|
||||
return;
|
||||
} else {
|
||||
// failed to start next, abort queue
|
||||
G.dl_missing_active=false;
|
||||
tt_lvgl_lock(portMAX_DELAY);
|
||||
if(G.lbl_status){
|
||||
char msg[64];
|
||||
snprintf(msg,sizeof(msg),"DL stopped %d ok %d fail", G.dl_missing_done, G.dl_missing_failed);
|
||||
lv_label_set_text(G.lbl_status, msg);
|
||||
}
|
||||
tt_lvgl_unlock();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// No more missing – queue finished
|
||||
ESP_LOGI(TAG, "Batch queue finished: %d ok %d fail", G.dl_missing_done, G.dl_missing_failed);
|
||||
G.dl_missing_active=false;
|
||||
tt_lvgl_lock(portMAX_DELAY);
|
||||
if(G.lbl_status){
|
||||
char msg[64];
|
||||
snprintf(msg,sizeof(msg),"DL S%02d done %d ok %d fail", G.dl_missing_season, G.dl_missing_done, G.dl_missing_failed);
|
||||
lv_label_set_text(G.lbl_status, msg);
|
||||
}
|
||||
tt_lvgl_unlock();
|
||||
if(success && idx>=0) ESP_LOGI(TAG, "Single DL success idx %d", idx);
|
||||
else ESP_LOGW(TAG, "External DL failed for idx %d", idx);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
tt_lvgl_lock(portMAX_DELAY);
|
||||
if (G.lbl_status) {
|
||||
if (success) lv_label_set_text(G.lbl_status, "DL done – tap to play");
|
||||
@@ -316,6 +365,7 @@ static void onHide(AppHandle app, void* data){
|
||||
save_current_ep_pos();
|
||||
G.fetch_cancel_req=true;
|
||||
G.dl_cancel_req=true;
|
||||
G.dl_missing_active=false;
|
||||
|
||||
if(G.fetch_handle){
|
||||
ESP_LOGI(TAG,"onHide: waiting fetch to exit");
|
||||
|
||||
Reference in New Issue
Block a user