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