def get_datasets(catalog, filter_in=None, filter_out=None, meta_field=None,
                 exclude_meta_fields=None, only_time_series=False):
    """Devuelve una lista de datasets del catálogo o de uno de sus metadatos.

    Args:
        catalog (dict, str or DataJson): Representación externa/interna de un
            catálogo. Una representación _externa_ es un path local o una
            URL remota a un archivo con la metadata de un catálogo, en
            formato JSON o XLSX. La representación _interna_ de un catálogo
            es un diccionario. Ejemplos: http://datos.gob.ar/data.json,
            http://www.ign.gob.ar/descargas/geodatos/catalog.xlsx,
            "/energia/catalog.xlsx".
        filter_in (dict): Devuelve los datasets cuyos atributos coinciden con
            los pasados en este diccionario. Ejemplo::
                {
                    "dataset": {
                        "publisher": {"name": "Ministerio de Ambiente"}
                    }
                }
            Sólo se devolverán los datasets de ese publisher_name.
        filter_out (dict): Devuelve los datasets cuyos atributos no coinciden
            con los pasados en este diccionario. Ejemplo::
                {
                    "dataset": {
                        "publisher": {"name": "Ministerio de Ambiente"}
                    }
                }
            Sólo se devolverán los datasets que no sean de ese publisher_name.
        meta_field (str): Nombre de un metadato de Dataset. En lugar de
            devolver los objetos completos "Dataset", devuelve una lista de
            valores para ese metadato presentes en el catálogo.
        exclude_meta_fields (list): Metadatos de Dataset que se quieren excluir
            de los objetos Dataset devueltos.
        only_time_series (bool): Si es verdadero, sólo devuelve datasets que
            tengan por lo menos una distribución de series de tiempo.
    """

    filter_in = filter_in or {}
    filter_out = filter_out or {}
    catalog = read_catalog_obj(catalog)

    if filter_in or filter_out:
        filtered_datasets = [
            dataset for dataset in catalog["dataset"] if
            _filter_dictionary(dataset, filter_in.get(
                "dataset"), filter_out.get("dataset"))
        ]
    else:
        filtered_datasets = catalog["dataset"]

    # realiza filtros especiales
    if only_time_series:
        filtered_datasets = [
            dataset for dataset in filtered_datasets
            if dataset_has_time_series(dataset)]

    if meta_field:
        return [dataset[meta_field] for dataset in filtered_datasets
                if meta_field in dataset]

    if exclude_meta_fields:
        meta_filtered_datasets = []
        for dataset in filtered_datasets:
            dataset_meta_filtered = dataset.copy()
            for excluded_meta_field in exclude_meta_fields:
                dataset_meta_filtered.pop(excluded_meta_field, None)
            meta_filtered_datasets.append(dataset_meta_filtered)

        return meta_filtered_datasets

    else:
        return filtered_datasets