Training Materials and a Video Library

Training Materials and a Video Library#

By the end of the 8th cohort, a total of 81 cohort calls (80 hours of training delivery, not including group discussions) have taken place during which 124 speakers gave 233 talks on the different topics planned in the curriculum (Figure 1B). Call recordings on the OLS YouTube channel received over 7,300 views (August 2024). They are embedded in the cohort schedule page on the website together with call metadata, learning objectives following Bloom’s taxonomy, details about speakers, and links to slide decks.

To make this Open Education Material easier to find and reuse, a video library of the talks has been created and made available online at https://openlifesci.org/openseeds/library.html. The 233 videos have been annotated and organized into 5 topics (“Tooling for Project Design”, “Tooling for Collaboration”, “Open Science”, “Project, Community & Personal Management”, “Open Leadership”) and 32 subtopics. These talks and the calls are also listed on TeSS, the ELIXIR Training Registry and Catalog (Beard et al. 2020).

import matplotlib.pyplot as plt
import pandas as pd
from pathlib import Path
import yt_dlp
library_df = pd.read_csv(Path("../data/library.csv"), index_col=0, na_filter= False)

Number of cohort calls with videos

len(library_df.groupby("date").count())
81

Number of talks

len(library_df)
236

Number of speakers

len(library_df.groupby(by="speakers").count())
124

The video library contains available videos from talks in Open Seeds cohort calls.

Tags and subtags

tag_df = (
    library_df
    .groupby(["tag", "subtag"])
    .count()
    .drop(columns=["title", "date", "cohort", "slides", "speakers"])
    .rename(columns={"recording": "total"})
    .rename(columns=str.capitalize)
)
tag_df
Total
tag subtag
Not sorted Not tagged 8
Open Leadership Open Leadership in Practice 30
Open Life Science OLS Introduction 12
Open Science Open Access Publication 8
Open Data 14
Open Educational Resources 7
Open Engagement of Social Actors 7
Open Evaluation 5
Open Hardware 6
Open Science Infrastructures 3
Open Science Introduction 3
Open Source Software 15
Openness to Diversity of Knowledge 3
Project, Community & Personal Management Agile & Iteractive Project Management 6
Ally Skills for Open Leaders 4
Community Design for Inclusivity 1
Community Interactions 6
Equity, Diversity and Inclusion (EDI) 6
Mountain of Engagement 8
Personal Ecology 9
Personas & Pathways 7
Tooling for Collaboration Code Review 3
Code of Conduct 8
GitHub Introduction 6
Good Coding Practices 3
Open Licensing 8
Package Management 1
README 8
Setting up a project 3
Tooling for Project Design Open Canvas 13
Project Roadmapping 13
Tooling for Project Design Introduction 2

YouTube stats#

All videos from Open Seeds calls are uploaded on the OLS YouTube channel

%%capture
ydl_opts = {}
URL = "https://www.youtube.com/c/OpenLifeSci"
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    info = ydl.extract_info(URL, download=False)
    # ydl.sanitize_info makes the info json-serializable
    channel_content = ydl.sanitize_info(info)

# extract video information
videos = []
for v in channel_content['entries'][0]['entries']:
    videos.append({key:v[key] for key in ['title', 'duration', 'view_count']})

yt_stat_df = (
    pd.DataFrame(videos)
    .assign(Duration=lambda df: df.duration/60)
    .drop(columns=["duration"])
    .rename(columns=str.capitalize)
)

openseeds_yt_df = yt_stat_df.query("Title.str.contains('OLS-')",engine="python")
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
Cell In[7], line 4
      2 URL = "https://www.youtube.com/c/OpenLifeSci"
      3 with yt_dlp.YoutubeDL(ydl_opts) as ydl:
----> 4     info = ydl.extract_info(URL, download=False)
      5     # ydl.sanitize_info makes the info json-serializable
      6     channel_content = ydl.sanitize_info(info)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1615, in YoutubeDL.extract_info(self, url, download, ie_key, extra_info, process, force_generic_extractor)
   1613             raise ExistingVideoReached
   1614         break
-> 1615     return self.__extract_info(url, self.get_info_extractor(key), download, extra_info, process)
   1616 else:
   1617     extractors_restricted = self.params.get('allowed_extractors') not in (None, ['default'])

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1626, in YoutubeDL._handle_extraction_exceptions.<locals>.wrapper(self, *args, **kwargs)
   1624 while True:
   1625     try:
-> 1626         return func(self, *args, **kwargs)
   1627     except (DownloadCancelled, LazyList.IndexError, PagedList.IndexError):
   1628         raise

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1782, in YoutubeDL.__extract_info(self, url, ie, download, extra_info, process)
   1780 if process:
   1781     self._wait_for_video(ie_result)
-> 1782     return self.process_ie_result(ie_result, download, extra_info)
   1783 else:
   1784     return ie_result

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1911, in YoutubeDL.process_ie_result(self, ie_result, download, extra_info)
   1909 self._sanitize_thumbnails(ie_result)
   1910 try:
-> 1911     return self.__process_playlist(ie_result, download)
   1912 finally:
   1913     self._playlist_level -= 1

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:2058, in YoutubeDL.__process_playlist(self, ie_result, download)
   2052     continue
   2054 self.to_screen(
   2055     f'[download] Downloading item {self._format_screen(i + 1, self.Styles.ID)} '
   2056     f'of {self._format_screen(n_entries, self.Styles.EMPHASIS)}')
-> 2058 entry_result = self.__process_iterable_entry(entry, download, collections.ChainMap({
   2059     'playlist_index': playlist_index,
   2060     'playlist_autonumber': i + 1,
   2061 }, extra))
   2062 if not entry_result:
   2063     failures += 1

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1626, in YoutubeDL._handle_extraction_exceptions.<locals>.wrapper(self, *args, **kwargs)
   1624 while True:
   1625     try:
-> 1626         return func(self, *args, **kwargs)
   1627     except (DownloadCancelled, LazyList.IndexError, PagedList.IndexError):
   1628         raise

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:2090, in YoutubeDL.__process_iterable_entry(self, entry, download, extra_info)
   2088 @_handle_extraction_exceptions
   2089 def __process_iterable_entry(self, entry, download, extra_info):
-> 2090     return self.process_ie_result(
   2091         entry, download=download, extra_info=extra_info)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1911, in YoutubeDL.process_ie_result(self, ie_result, download, extra_info)
   1909 self._sanitize_thumbnails(ie_result)
   1910 try:
-> 1911     return self.__process_playlist(ie_result, download)
   1912 finally:
   1913     self._playlist_level -= 1

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:2058, in YoutubeDL.__process_playlist(self, ie_result, download)
   2052     continue
   2054 self.to_screen(
   2055     f'[download] Downloading item {self._format_screen(i + 1, self.Styles.ID)} '
   2056     f'of {self._format_screen(n_entries, self.Styles.EMPHASIS)}')
-> 2058 entry_result = self.__process_iterable_entry(entry, download, collections.ChainMap({
   2059     'playlist_index': playlist_index,
   2060     'playlist_autonumber': i + 1,
   2061 }, extra))
   2062 if not entry_result:
   2063     failures += 1

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1626, in YoutubeDL._handle_extraction_exceptions.<locals>.wrapper(self, *args, **kwargs)
   1624 while True:
   1625     try:
-> 1626         return func(self, *args, **kwargs)
   1627     except (DownloadCancelled, LazyList.IndexError, PagedList.IndexError):
   1628         raise

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:2090, in YoutubeDL.__process_iterable_entry(self, entry, download, extra_info)
   2088 @_handle_extraction_exceptions
   2089 def __process_iterable_entry(self, entry, download, extra_info):
-> 2090     return self.process_ie_result(
   2091         entry, download=download, extra_info=extra_info)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1861, in YoutubeDL.process_ie_result(self, ie_result, download, extra_info)
   1857     return ie_result
   1858 elif result_type == 'url':
   1859     # We have to add extra_info to the results because it may be
   1860     # contained in a playlist
-> 1861     return self.extract_info(
   1862         ie_result['url'], download,
   1863         ie_key=ie_result.get('ie_key'),
   1864         extra_info=extra_info)
   1865 elif result_type == 'url_transparent':
   1866     # Use the information from the embedding page
   1867     info = self.extract_info(
   1868         ie_result['url'], ie_key=ie_result.get('ie_key'),
   1869         extra_info=extra_info, download=False, process=False)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1615, in YoutubeDL.extract_info(self, url, download, ie_key, extra_info, process, force_generic_extractor)
   1613             raise ExistingVideoReached
   1614         break
-> 1615     return self.__extract_info(url, self.get_info_extractor(key), download, extra_info, process)
   1616 else:
   1617     extractors_restricted = self.params.get('allowed_extractors') not in (None, ['default'])

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1626, in YoutubeDL._handle_extraction_exceptions.<locals>.wrapper(self, *args, **kwargs)
   1624 while True:
   1625     try:
-> 1626         return func(self, *args, **kwargs)
   1627     except (DownloadCancelled, LazyList.IndexError, PagedList.IndexError):
   1628         raise

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:1761, in YoutubeDL.__extract_info(self, url, ie, download, extra_info, process)
   1758 self._apply_header_cookies(url)
   1760 try:
-> 1761     ie_result = ie.extract(url)
   1762 except UserNotLive as e:
   1763     if process:

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/common.py:740, in InfoExtractor.extract(self, url)
    737 self.initialize()
    738 self.to_screen('Extracting URL: %s' % (
    739     url if self.get_param('verbose') else truncate_string(url, 100, 20)))
--> 740 ie_result = self._real_extract(url)
    741 if ie_result is None:
    742     return None

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/youtube.py:4248, in YoutubeIE._real_extract(self, url)
   4245 base_url = self.http_scheme() + '//www.youtube.com/'
   4246 webpage_url = base_url + 'watch?v=' + video_id
-> 4248 webpage, master_ytcfg, player_responses, player_url = self._download_player_responses(url, smuggled_data, video_id, webpage_url)
   4250 playability_statuses = traverse_obj(
   4251     player_responses, (..., 'playabilityStatus'), expected_type=dict)
   4253 trailer_video_id = get_first(
   4254     playability_statuses,
   4255     ('errorScreen', 'playerLegacyDesktopYpcTrailerRenderer', 'trailerVideoId'),
   4256     expected_type=str)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/youtube.py:4212, in YoutubeIE._download_player_responses(self, url, smuggled_data, video_id, webpage_url)
   4207     webpage = self._download_webpage(
   4208         webpage_url, video_id, fatal=False, query=query)
   4210 master_ytcfg = self.extract_ytcfg(video_id, webpage) or self._get_default_ytcfg()
-> 4212 player_responses, player_url = self._extract_player_responses(
   4213     self._get_requested_clients(url, smuggled_data),
   4214     video_id, webpage, master_ytcfg, smuggled_data)
   4216 return webpage, master_ytcfg, player_responses, player_url

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/youtube.py:3833, in YoutubeIE._extract_player_responses(self, clients, video_id, webpage, master_ytcfg, smuggled_data)
   3831 for retry in self.RetryManager(fatal=False):
   3832     try:
-> 3833         pr = pr or self._extract_player_response(
   3834             client, video_id, player_ytcfg or master_ytcfg, player_ytcfg,
   3835             player_url if require_js_player else None, initial_pr, smuggled_data)
   3836     except ExtractorError as e:
   3837         self.report_warning(e)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/youtube.py:3730, in YoutubeIE._extract_player_response(self, client, video_id, master_ytcfg, player_ytcfg, player_url, initial_pr, smuggled_data)
   3727     yt_query['params'] = player_params
   3729 yt_query.update(self._generate_player_context(sts))
-> 3730 return self._extract_response(
   3731     item_id=video_id, ep='player', query=yt_query,
   3732     ytcfg=player_ytcfg, headers=headers, fatal=True,
   3733     default_client=client,
   3734     note='Downloading {} player API JSON'.format(client.replace('_', ' ').strip()),
   3735 ) or None

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/youtube.py:1012, in YoutubeBaseInfoExtractor._extract_response(self, item_id, query, note, headers, ytcfg, check_get_keys, ep, fatal, api_hostname, default_client)
   1010 while True:
   1011     try:
-> 1012         response = self._call_api(
   1013             ep=ep, fatal=True, headers=headers,
   1014             video_id=item_id, query=query, note=note,
   1015             context=self._extract_context(ytcfg, default_client),
   1016             api_hostname=api_hostname, default_client=default_client)
   1017     except ExtractorError as e:
   1018         if not isinstance(e.cause, network_exceptions):

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/youtube.py:656, in YoutubeBaseInfoExtractor._call_api(self, ep, query, video_id, fatal, headers, note, errnote, context, api_key, api_hostname, default_client)
    654 if headers:
    655     real_headers.update(headers)
--> 656 return self._download_json(
    657     f'https://{self._select_api_hostname(api_hostname, default_client)}/youtubei/v1/{ep}',
    658     video_id=video_id, fatal=fatal, note=note, errnote=errnote,
    659     data=json.dumps(data).encode('utf8'), headers=real_headers,
    660     query=filter_dict({
    661         'key': self._configuration_arg(
    662             'innertube_key', [api_key], ie_key=YoutubeIE.ie_key(), casesense=True)[0],
    663         'prettyPrint': 'false',
    664     }, cndn=lambda _, v: v))

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/common.py:1139, in InfoExtractor.__create_download_methods.<locals>.download_content(self, url_or_request, video_id, note, errnote, transform_source, fatal, encoding, data, headers, query, expected_status, impersonate, require_impersonation)
   1137     kwargs.pop('transform_source')
   1138 # The method is fetched by name so subclasses can override _download_..._handle
-> 1139 res = getattr(self, download_handle.__name__)(url_or_request, video_id, **kwargs)
   1140 return res if res is False else res[0]

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/common.py:1099, in InfoExtractor.__create_download_methods.<locals>.download_handle(self, url_or_request, video_id, note, errnote, transform_source, fatal, encoding, data, headers, query, expected_status, impersonate, require_impersonation)
   1096 def download_handle(self, url_or_request, video_id, note=note, errnote=errnote, transform_source=None,
   1097                     fatal=True, encoding=None, data=None, headers={}, query={}, expected_status=None,
   1098                     impersonate=None, require_impersonation=False):
-> 1099     res = self._download_webpage_handle(
   1100         url_or_request, video_id, note=note, errnote=errnote, fatal=fatal, encoding=encoding,
   1101         data=data, headers=headers, query=query, expected_status=expected_status,
   1102         impersonate=impersonate, require_impersonation=require_impersonation)
   1103     if res is False:
   1104         return res

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/common.py:960, in InfoExtractor._download_webpage_handle(self, url_or_request, video_id, note, errnote, fatal, encoding, data, headers, query, expected_status, impersonate, require_impersonation)
    957 if isinstance(url_or_request, str):
    958     url_or_request = url_or_request.partition('#')[0]
--> 960 urlh = self._request_webpage(url_or_request, video_id, note, errnote, fatal, data=data,
    961                              headers=headers, query=query, expected_status=expected_status,
    962                              impersonate=impersonate, require_impersonation=require_impersonation)
    963 if urlh is False:
    964     assert not fatal

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/extractor/common.py:896, in InfoExtractor._request_webpage(self, url_or_request, video_id, note, errnote, fatal, data, headers, query, expected_status, impersonate, require_impersonation)
    893     self.report_warning(f'{message}; if you encounter errors, then {info_msg}', only_once=True)
    895 try:
--> 896     return self._downloader.urlopen(self._create_request(url_or_request, data, headers, query, extensions))
    897 except network_exceptions as err:
    898     if isinstance(err, HTTPError):

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/YoutubeDL.py:4165, in YoutubeDL.urlopen(self, req)
   4162 clean_headers(req.headers)
   4164 try:
-> 4165     return self._request_director.send(req)
   4166 except NoSupportingHandlers as e:
   4167     for ue in e.unsupported_errors:
   4168         # FIXME: This depends on the order of errors.

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/networking/common.py:117, in RequestDirector.send(self, request)
    115 self._print_verbose(f'Sending request via "{handler.RH_NAME}"')
    116 try:
--> 117     response = handler.send(request)
    118 except RequestError:
    119     raise

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/networking/_helper.py:208, in wrap_request_errors.<locals>.wrapper(self, *args, **kwargs)
    205 @functools.wraps(func)
    206 def wrapper(self, *args, **kwargs):
    207     try:
--> 208         return func(self, *args, **kwargs)
    209     except UnsupportedRequest as e:
    210         if e.handler is None:

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/networking/common.py:340, in RequestHandler.send(self, request)
    338 if not isinstance(request, Request):
    339     raise TypeError('Expected an instance of Request')
--> 340 return self._send(request)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/yt_dlp/networking/_requests.py:328, in RequestsRH._send(self, request)
    322 session = self._get_instance(
    323     cookiejar=self._get_cookiejar(request),
    324     legacy_ssl_support=request.extensions.get('legacy_ssl'),
    325 )
    327 try:
--> 328     requests_res = session.request(
    329         method=request.method,
    330         url=request.url,
    331         data=request.data,
    332         headers=headers,
    333         timeout=self._calculate_timeout(request),
    334         proxies=self._get_proxies(request),
    335         allow_redirects=True,
    336         stream=True,
    337     )
    339 except requests.exceptions.TooManyRedirects as e:
    340     max_redirects_exceeded = True

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/requests/sessions.py:589, in Session.request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    584 send_kwargs = {
    585     "timeout": timeout,
    586     "allow_redirects": allow_redirects,
    587 }
    588 send_kwargs.update(settings)
--> 589 resp = self.send(prep, **send_kwargs)
    591 return resp

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/requests/sessions.py:703, in Session.send(self, request, **kwargs)
    700 start = preferred_clock()
    702 # Send the request
--> 703 r = adapter.send(request, **kwargs)
    705 # Total elapsed time of the request (approximately)
    706 elapsed = preferred_clock() - start

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/requests/adapters.py:667, in HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies)
    664     timeout = TimeoutSauce(connect=timeout, read=timeout)
    666 try:
--> 667     resp = conn.urlopen(
    668         method=request.method,
    669         url=url,
    670         body=request.body,
    671         headers=request.headers,
    672         redirect=False,
    673         assert_same_host=False,
    674         preload_content=False,
    675         decode_content=False,
    676         retries=self.max_retries,
    677         timeout=timeout,
    678         chunked=chunked,
    679     )
    681 except (ProtocolError, OSError) as err:
    682     raise ConnectionError(err, request=request)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/urllib3/connectionpool.py:789, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)
    786 response_conn = conn if not release_conn else None
    788 # Make the request on the HTTPConnection object
--> 789 response = self._make_request(
    790     conn,
    791     method,
    792     url,
    793     timeout=timeout_obj,
    794     body=body,
    795     headers=headers,
    796     chunked=chunked,
    797     retries=retries,
    798     response_conn=response_conn,
    799     preload_content=preload_content,
    800     decode_content=decode_content,
    801     **response_kw,
    802 )
    804 # Everything went great!
    805 clean_exit = True

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/urllib3/connectionpool.py:536, in HTTPConnectionPool._make_request(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)
    534 # Receive the response from the server
    535 try:
--> 536     response = conn.getresponse()
    537 except (BaseSSLError, OSError) as e:
    538     self._raise_timeout(err=e, url=url, timeout_value=read_timeout)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/site-packages/urllib3/connection.py:464, in HTTPConnection.getresponse(self)
    461 from .response import HTTPResponse
    463 # Get the response from http.client.HTTPConnection
--> 464 httplib_response = super().getresponse()
    466 try:
    467     assert_header_parsing(httplib_response.msg)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/http/client.py:1428, in HTTPConnection.getresponse(self)
   1426 try:
   1427     try:
-> 1428         response.begin()
   1429     except ConnectionError:
   1430         self.close()

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/http/client.py:331, in HTTPResponse.begin(self)
    329 # read until we get a non-100 response
    330 while True:
--> 331     version, status, reason = self._read_status()
    332     if status != CONTINUE:
    333         break

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/http/client.py:292, in HTTPResponse._read_status(self)
    291 def _read_status(self):
--> 292     line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
    293     if len(line) > _MAXLINE:
    294         raise LineTooLong("status line")

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/socket.py:708, in SocketIO.readinto(self, b)
    706 while True:
    707     try:
--> 708         return self._sock.recv_into(b)
    709     except timeout:
    710         self._timeout_occurred = True

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/ssl.py:1252, in SSLSocket.recv_into(self, buffer, nbytes, flags)
   1248     if flags != 0:
   1249         raise ValueError(
   1250           "non-zero flags not allowed in calls to recv_into() on %s" %
   1251           self.__class__)
-> 1252     return self.read(nbytes, buffer)
   1253 else:
   1254     return super().recv_into(buffer, nbytes, flags)

File /usr/share/miniconda/envs/open-seeds-paper-2024/lib/python3.12/ssl.py:1104, in SSLSocket.read(self, len, buffer)
   1102 try:
   1103     if buffer is not None:
-> 1104         return self._sslobj.read(len, buffer)
   1105     else:
   1106         return self._sslobj.read(len)

KeyboardInterrupt: 

Number of hours of Open Seeds videos on the YouTube channel

sum(openseeds_yt_df.Duration)/60
80.73777777777778

Total number of view of the Open Seeds videos on the YouTube channel

sum(openseeds_yt_df.View_count)
7298

Video library#

tag_df = (
    library_df
    .groupby(["tag", "subtag"])
    .count()
    .drop(columns=["title", "date", "cohort", "slides", "speakers"])
    .rename(columns={"recording": "total"})
    .rename(columns=str.capitalize)
)
tag_df
Total
tag subtag
Not sorted Not tagged 8
Open Leadership Open Leadership in Practice 30
Open Life Science OLS Introduction 12
Open Science Open Access Publication 8
Open Data 14
Open Educational Resources 7
Open Engagement of Social Actors 7
Open Evaluation 5
Open Hardware 6
Open Science Infrastructures 3
Open Science Introduction 3
Open Source Software 15
Openness to Diversity of Knowledge 3
Project, Community & Personal Management Agile & Iteractive Project Management 6
Ally Skills for Open Leaders 4
Community Design for Inclusivity 1
Community Interactions 6
Equity, Diversity and Inclusion (EDI) 6
Mountain of Engagement 8
Personal Ecology 9
Personas & Pathways 7
Tooling for Collaboration Code Review 3
Code of Conduct 8
GitHub Introduction 6
Good Coding Practices 3
Open Licensing 8
Package Management 1
README 8
Setting up a project 3
Tooling for Project Design Open Canvas 13
Project Roadmapping 13
Tooling for Project Design Introduction 2
len(tag_df)
32