---
# System prepended metadata

title: Предметная область source и подкасты

---

# Предметная область source и подкасты


## TL;DR Вывод

Добавить еще одно измерение полезно, когда мы знаем, куда будет двигаться развитие сорцов. Но мы не знаем. Поэтому делаем как проще.

Оставляем поле `type` ответственным за то, чтобы отвечать на оба вопроса

- как парсить поле `data`
- как качать ресурсы
- как интерпретировать результат 


## Проблема (или нет)

Смущает, что мы пытаемся создать клон типа "rss".

Сейчас есть поле `type` которое отвечает на вопрос «как мне скачать данные». Оно не говорит о том, как отобразить посты.

```
Source.type = rss | crawler | fulldive
```

На планировании мы пришли к тому, что будет тип сорцов, который будет работать не в тех же сценариях, что и РСС. Например, такие сорцы будут фильтроваться для отдельной выдачи. Технически решение выглядит приводит к такому изменению

```
source.type =    rss   | podcast  | crawler | fulldive
source.data =    (all the same)   |   ...   |   ...
```

К чему это приводит. Мы будем добавлять в if-ы дополнительное условие о том, что надо вызывать один и тот же фетчер для подкастов и РСС. Зачем тогда это разделение на этапе скачивания?

Подкаст — это подмножество РСС. Технического отличия нет. Есть только бизнесовое отличие. Разница появляется тогда, когда надо отобразить эпизоды подкастов вместо новостей. Что если таких сценариев еще прибавится?

## Контр-проблема

Зачем серверу знать про разницу в фетчинге и отображении? Мы просто храним тип фида и типозависимвые особенности. Маппинг фетчинга и отображения лежит на клиенте.

## Модель данных

### Как сейчас сделано

```javascript
Source {
    type = rss  // качать РСС и интерпретировать как текст с картинкой
    data = {
        url = "..."
    }
}

Source {
    type = podcast  // качать РСС и показывать как эпизоды подкаста
    data = {
        url = "..."
    }
}

Source {
    type = crawler // качать с помощью webview и показать как там надо
    data = {
        url = "..."
    }
}

Source {
    type = fulldive // пойти в апи авторизованным клиентом, получить ресурсы
    data = {
        ...
    }
}
```

### Вариант РСС-специфики

Сработает, если мы уверены, что данные подкаста и общего случая РСС не разойдутся

```javascript
Source {
    type = rss                      // надо качать РСС
    data = {
        interpretation = generic    // интерпретировать как посты/новости
        url = "..."
    }
}

Source {
    type = rss                      // надо качать РСС 
    data = {
        interpretation = podcast    // интерпретировать как эпизоды с аудио
        url = "..."
    }
}

Source {
    type = crawler // качать с помощью webview и показать как там надо
    data = {
        // дополнительных интерпретаций нет
        url = "..."
    }
}

Source {
    type = fulldive // пойти в апи авторизованным клиентом, получить ресурсы
    data = {
        // дополнительных интерпретаций нет
        ...
    }
}
```
