| 4077 | ], |
| 4078 | ) |
| 4079 | def delete(self, request): |
| 4080 | tvg_id = str(request.query_params.get("tvg_id") or "").strip() |
| 4081 | title = request.query_params.get("title") |
| 4082 | |
| 4083 | rules = CoreSettings.get_dvr_series_rules() |
| 4084 | |
| 4085 | def _matches(r): |
| 4086 | tvg_match = str(r.get("tvg_id") or "") == tvg_id |
| 4087 | title_match = title is None or str(r.get("title") or "") == title |
| 4088 | return tvg_match and title_match |
| 4089 | |
| 4090 | deleted_rule = next((r for r in rules if _matches(r)), None) |
| 4091 | remaining = [r for r in rules if not _matches(r)] |
| 4092 | CoreSettings.set_dvr_series_rules(remaining) |
| 4093 | |
| 4094 | removed = 0 |
| 4095 | if deleted_rule: |
| 4096 | from .models import Recording |
| 4097 | qs = Recording.objects.filter(start_time__gte=timezone.now()) |
| 4098 | rule_tvg_id = deleted_rule.get("tvg_id") or "" |
| 4099 | if rule_tvg_id: |
| 4100 | qs = qs.filter(custom_properties__program__tvg_id=rule_tvg_id) |
| 4101 | rule_title = deleted_rule.get("title") or "" |
| 4102 | if rule_title: |
| 4103 | qs = qs.filter(custom_properties__program__title=rule_title) |
| 4104 | removed = qs.count() |
| 4105 | qs.delete() |
| 4106 | |
| 4107 | try: |
| 4108 | from core.utils import send_websocket_update |
| 4109 | send_websocket_update('updates', 'update', { |
| 4110 | "success": True, "type": "recordings_refreshed", "removed": removed, |
| 4111 | }) |
| 4112 | except Exception: |
| 4113 | pass |
| 4114 | |
| 4115 | return Response({"success": True, "rules": remaining, "removed": removed}) |
| 4116 | |
| 4117 | |
| 4118 | class SeriesRulePreviewAPIView(APIView): |