Repository: sunpy/sunpy

Issue:
Provide easier access to valid TimeSeries source keywords
<!--
We know asking good questions takes effort, and we appreciate your time.
Thank you.

Please be aware that everyone has to follow our code of conduct:
https://github.com/sunpy/sunpy/blob/master/CODE_OF_CONDUCT.rst

Also that these comments are hidden when you submit this github issue.

Please have a search on our GitHub repository to see if a similar issue has already been posted.
If a similar issue is closed, have a quick look to see if you are satisfied by the resolution.
If not please go ahead and open an issue!
-->

### Description
<!--
Provide a general description of the feature you would like.
If you prefer, you can also suggest a draft design or API.
This way we have a deeper discussion on the feature.
-->
I suggest that it should be shown at the top when a user inputs the command
```python
help(TimeSeries)
```

### Additional context
<!--
Add any other context or screenshots
This part is optional.
Delete this section heading if you do not use it.
-->



Discussion:
I think all the supported timeseries can recognize the source from the input data file in `is_datasource_for`. 

However it would be nice to have a way to easily access them, we should also have a check to see if the source provided is valid. 

We should have a better error for things like this:

```python
>>> my_timeseries = sunpy.timeseries.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES, 
                                     source='lyra')
ValueError: Input values did not match any of the formats where the format keyword is optional: {'datetime': TypeError('Input values for datetime class must be datetime objects'), 'ymdhms': ValueError('input must be dict or table-like'), 'iso': ValueError('Time 07/06/2011 does not match iso format'), 'isot': ValueError('Time 07/06/2011 does not match isot format'), 'yday': ValueError('Time 07/06/2011 does not match yday format'), 'datetime64': TypeError('Input values for datetime64 class must be datetime64 objects'), 'fits': ValueError('Time 07/06/2011 does not match fits format'), 'byear_str': ValueError('Time 07/06/2011 does not match byear_str format'), 'jyear_str': ValueError('Time 07/06/2011 does not match jyear_str format'), 'astropy_time': TypeError('Input values for astropy_time class must all be same astropy Time type.')}
```

as the source keyword over rights the detection from the input filename itself. 

Good point! Then why do we set the source in the gallery examples explicitly? In any case, it would nice to easily look it up and not have to run to the online docs.
Actually the more I think about it there is really no reason for source? Unless I'm missing something. 

Even if you made a `TimeSeries` from your own data and use `source` the data does not have to conform to the `source` data structure as far as I can tell (i.e. same column names or meta information). 

But again I could be missing something on why `source` exists .... 
But yes, it probably should be removed from the docs and example gallery unless someone else has a point to why its there
Wait it's needed for `NOAAIndices`,  `NOAAPredictIndicesTimeSeries` and `EVESpWxTimeSeries` - but not for the others

Resolving patch:
diff --git a/sunpy/timeseries/sources/__init__.py b/sunpy/timeseries/sources/__init__.py
--- a/sunpy/timeseries/sources/__init__.py
+++ b/sunpy/timeseries/sources/__init__.py
@@ -13,3 +13,8 @@
 from sunpy.timeseries.sources.noaa import NOAAIndicesTimeSeries, NOAAPredictIndicesTimeSeries
 from sunpy.timeseries.sources.norh import NoRHTimeSeries
 from sunpy.timeseries.sources.rhessi import RHESSISummaryTimeSeries
+
+__all__ = ['ESPTimeSeries', 'EVESpWxTimeSeries', 'GBMSummaryTimeSeries', 'XRSTimeSeries', 'LYRATimeSeries',
+           'NOAAIndicesTimeSeries', 'NOAAPredictIndicesTimeSeries', 'NoRHTimeSeries', 'RHESSISummaryTimeSeries']
+
+source_names = {globals()[s]._source for s in __all__}
diff --git a/sunpy/timeseries/timeseries_factory.py b/sunpy/timeseries/timeseries_factory.py
--- a/sunpy/timeseries/timeseries_factory.py
+++ b/sunpy/timeseries/timeseries_factory.py
@@ -19,6 +19,7 @@
 import sunpy
 from sunpy.io.file_tools import UnrecognizedFileTypeError, detect_filetype, read_file
 from sunpy.io.header import FileHeader
+from sunpy.timeseries.sources import source_names
 from sunpy.timeseries.timeseriesbase import GenericTimeSeries
 from sunpy.util import expand_list
 from sunpy.util.config import get_and_create_download_dir
@@ -50,7 +51,7 @@ class TimeSeriesFactory(BasicRegistrationFactory):
         Inputs to parse for timeseries objects. See the example section for a
         detailed list of possible inputs.
 
-    source : `str`, optional
+    source : {source_names}, optional
         A string to select the observational source of the data, currently
         necessary to define how files should be read for all instruments.
 
@@ -522,6 +523,7 @@ class NoTimeSeriesFound(ValueError):
     """
 
 
+TimeSeriesFactory.__doc__ = TimeSeriesFactory.__doc__.format(source_names=source_names)
 TimeSeries = TimeSeriesFactory(registry=GenericTimeSeries._registry,
                                default_widget_type=GenericTimeSeries,
                                additional_validation_functions=['is_datasource_for'])


Test patch: