├── .gitignore ├── .gitmodules ├── README.rst ├── config ├── __init__.py └── pyvideo_settings.py ├── cron ├── pg_backup.config ├── pg_backup_rotated.sh └── richard_update_index.sh ├── staticbase └── favicon.ico └── templates ├── 404.html ├── 500.html ├── base.html ├── home_branded.html └── pages └── about.html /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *~ 3 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "richard"] 2 | path = richard 3 | url = https://github.com/willkg/richard.git 4 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ====== 2 | README 3 | ====== 4 | 5 | **This project is inactive.** 6 | 7 | This project was sunset on 2016/01/15: `pyvideo status: January 15th, 2016 `_ 8 | 9 | This repository was historically used for holding the bits for running the pyvideo.org site. 10 | 11 | pyvideo.org was an instance of `richard `_ 12 | which is a Django-based web application for building video index sites like 13 | pyvideo. 14 | 15 | Setup notes 16 | =========== 17 | 18 | There's a bunch of stuff in this repository. For running pyvideo, there are two 19 | interesting directories: 20 | 21 | * ``config/`` holds the pyvideo specific settings 22 | * ``templates/`` holds templates that override richard templates 23 | 24 | To run pyvideo locally, you need to set some environment variables and then 25 | run richard's ``manage.py``:: 26 | 27 | SITE_PATH=, 28 | DJANGO_SETTINGS_MODULE=pyvideo_settings 29 | DJANGO_CONFIGURATION=PyvideoLocal 30 | DJANGO_DATABASES= 31 | DJANGO_SECRET_KEY= 32 | -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyvideo/old-pyvideo/7eaa9fa847818b6a1879cc41b3cfc30b24d6d8eb/config/__init__.py -------------------------------------------------------------------------------- /config/pyvideo_settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from richard.config.settings import Prod, BASE_DIR 4 | 5 | 6 | PYVIDEO_ROOT = os.path.dirname(os.path.dirname(__file__)) 7 | 8 | 9 | class Pyvideo(Prod): 10 | """pyvideo.org production environment""" 11 | SITE_URL = 'http://pyvideo.org' 12 | 13 | ALLOWED_HOSTS = [u'pyvideo.org', u'www.pyvideo.org'] 14 | BROWSERID_AUDIENCES = ['http://' + host for host in ALLOWED_HOSTS] 15 | 16 | SITE_TITLE = u'pyvideo.org' 17 | 18 | ADMINS = ( 19 | # ('Your Name', 'your_email@example.com'), 20 | ('Will Kahn-Greene', 'willkg@bluesock.org'), 21 | ('Sheila Miguez', 'shekay@pobox.com'), 22 | # ('Carl Superfly Karsten', 'cfkarsten@gmail.com'), 23 | ) 24 | 25 | SERVER_EMAIL = 'noreply-error@pyvideo.org' 26 | 27 | MANAGERS = ADMINS 28 | 29 | AMARA_SUPPORT = True 30 | API = True 31 | PAGES = ['about'] 32 | MAX_FEED_LENGTH = 30 33 | VIDEO_THUMBNAIL_SIZE = (160, 120) 34 | 35 | HAYSTACK_CONNECTIONS = { 36 | 'default': { 37 | 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', 38 | 'PATH': os.path.join(BASE_DIR, 'whoosh_index'), 39 | }, 40 | } 41 | 42 | STATICFILES_DIRS = ( 43 | # Add pyvideo staticbase for additional static files. 44 | os.path.join(PYVIDEO_ROOT, 'staticbase'), 45 | ) 46 | 47 | TEMPLATE_DIRS = ( 48 | os.path.join(PYVIDEO_ROOT, 'templates'), 49 | ) 50 | 51 | EMAIL_SUBJECT_PREFIX = '[Django pyvideo]' 52 | 53 | LOGGING = { 54 | 'version': 1, 55 | 'disable_existing_loggers': False, 56 | 'filters': { 57 | 'require_debug_false': { 58 | '()': 'django.utils.log.RequireDebugFalse' 59 | } 60 | }, 61 | 'handlers': { 62 | 'null': { 63 | 'level': 'DEBUG', 64 | 'class': 'logging.NullHandler', 65 | }, 66 | 'mail_admins': { 67 | 'level': 'ERROR', 68 | 'filters': ['require_debug_false'], 69 | 'class': 'django.utils.log.AdminEmailHandler' 70 | } 71 | }, 72 | 'loggers': { 73 | 'django.request': { 74 | 'handlers': ['mail_admins'], 75 | 'level': 'ERROR', 76 | 'propagate': True, 77 | }, 78 | # Quell those "Invalid HTTP_HOST header" emails 79 | 'django.security.DisallowedHost': { 80 | 'handlers': ['null'], 81 | 'propagate': False, 82 | }, 83 | } 84 | } 85 | 86 | 87 | class DevPyvideo(Pyvideo): 88 | """dev.pyvideo.org stage environment""" 89 | SITE_URL = 'http://dev.pyvideo.org' 90 | ALLOWED_HOSTS = [u'dev.pyvideo.org', u'dev.pyvideo.org:80'] 91 | BROWSERID_AUDIENCES = ['http://dev.pyvideo.org', 'http://dev.pyvideo.org:80'] 92 | SITE_TITLE = u'dev.pyvideo.org' 93 | 94 | EMAIL_SUBJECT_PREFIX = '[Django dev.pyvideo]' 95 | 96 | 97 | class PyvideoLocal(Pyvideo): 98 | """pyvideo environment for local development""" 99 | DEBUG = True 100 | TEMPLATE_DEBUG = True 101 | 102 | LOGGING = { 103 | 'version': 1, 104 | 'disable_existing_loggers': True, 105 | 'formatters': { 106 | 'verbose': { 107 | 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' 108 | }, 109 | 'simple': { 110 | 'format': '%(levelname)s %(message)s' 111 | }, 112 | }, 113 | 'filters': { 114 | }, 115 | 'handlers': { 116 | 'console':{ 117 | 'level':'DEBUG', 118 | 'class':'logging.StreamHandler', 119 | 'formatter': 'simple' 120 | }, 121 | }, 122 | 'loggers': { 123 | 'django': { 124 | 'handlers':['console'], 125 | 'propagate': True, 126 | 'level':'INFO', 127 | }, 128 | 'django.request': { 129 | 'handlers': ['console'], 130 | 'level': 'ERROR', 131 | 'propagate': False, 132 | }, 133 | } 134 | } 135 | 136 | SITE_URL = 'http://127.0.0.1:8000' 137 | BROWSERID_AUDIENCES = ['http://127.0.0.1:8000', 'http://localhost:8000'] 138 | -------------------------------------------------------------------------------- /cron/pg_backup.config: -------------------------------------------------------------------------------- 1 | # From: https://wiki.postgresql.org/wiki/Automated_Backup_on_Linux 2 | ############################## 3 | ## POSTGRESQL BACKUP CONFIG ## 4 | ############################## 5 | 6 | # Optional system user to run backups as. If the user the script is running as doesn't match this 7 | # the script terminates. Leave blank to skip check. 8 | BACKUP_USER=postgres 9 | 10 | # Optional hostname to adhere to pg_hba policies. Will default to "localhost" if none specified. 11 | HOSTNAME=localhost 12 | 13 | # Optional username to connect to database as. Will default to "postgres" if none specified. 14 | USERNAME=postgres 15 | 16 | # This dir will be created if it doesn't exist. This must be writable by the user the script is 17 | # running as. 18 | BACKUP_DIR=/srv/richardsite/backups/ 19 | 20 | # List of strings to match against in database name, separated by space or comma, for which we only 21 | # wish to keep a backup of the schema, not the data. Any database names which contain any of these 22 | # values will be considered candidates. (e.g. "system_log" will match "dev_system_log_2010-01") 23 | SCHEMA_ONLY_LIST="" 24 | 25 | # Will produce a custom-format backup if set to "yes" 26 | ENABLE_CUSTOM_BACKUPS=yes 27 | 28 | # Will produce a gzipped plain-format backup if set to "yes" 29 | ENABLE_PLAIN_BACKUPS=yes 30 | 31 | 32 | #### SETTINGS FOR ROTATED BACKUPS #### 33 | 34 | # Which day to take the weekly backup from (1-7 = Monday-Sunday) 35 | DAY_OF_WEEK_TO_KEEP=5 # Friday 36 | 37 | # Number of days to keep daily backups 38 | DAYS_TO_KEEP=7 39 | 40 | # How many weeks to keep weekly backups 41 | WEEKS_TO_KEEP=5 42 | ###################################### 43 | -------------------------------------------------------------------------------- /cron/pg_backup_rotated.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Usage: 4 | # $ pg_backup_rotated.sh [-c /path/to/config] 5 | 6 | ########################### 7 | ####### LOAD CONFIG ####### 8 | ########################### 9 | 10 | while [ $# -gt 0 ]; do 11 | case $1 in 12 | -c) 13 | CONFIG_FILE_PATH="$2" 14 | shift 2 15 | ;; 16 | *) 17 | ${ECHO} "Unknown Option \"$1\"" 1>&2 18 | exit 2 19 | ;; 20 | esac 21 | done 22 | 23 | if [ -z $CONFIG_FILE_PATH ] ; then 24 | SCRIPTPATH=$(cd ${0%/*} && pwd -P) 25 | CONFIG_FILE_PATH="${SCRIPTPATH}/pg_backup.config" 26 | fi 27 | 28 | if [ ! -r ${CONFIG_FILE_PATH} ] ; then 29 | echo "Could not load config file from ${CONFIG_FILE_PATH}" 1>&2 30 | exit 1 31 | fi 32 | 33 | source "${CONFIG_FILE_PATH}" 34 | 35 | ########################### 36 | #### PRE-BACKUP CHECKS #### 37 | ########################### 38 | 39 | # Make sure we're running as the required backup user 40 | if [ "$BACKUP_USER" != "" -a "$(id -un)" != "$BACKUP_USER" ] ; then 41 | echo "This script must be run as $BACKUP_USER. Exiting." 1>&2 42 | exit 1 43 | fi 44 | 45 | 46 | ########################### 47 | ### INITIALISE DEFAULTS ### 48 | ########################### 49 | 50 | if [ ! $USERNAME ]; then 51 | USERNAME="postgres" 52 | fi; 53 | 54 | 55 | ########################### 56 | #### START THE BACKUPS #### 57 | ########################### 58 | 59 | function perform_backups() 60 | { 61 | SUFFIX=$1 62 | FINAL_BACKUP_DIR=$BACKUP_DIR"`date +\%Y-\%m-\%d`$SUFFIX/" 63 | 64 | echo "Making backup directory in $FINAL_BACKUP_DIR" 65 | 66 | if ! mkdir -p $FINAL_BACKUP_DIR; then 67 | echo "Cannot create backup directory in $FINAL_BACKUP_DIR. Go and fix it!" 1>&2 68 | exit 1; 69 | fi; 70 | 71 | 72 | ########################### 73 | ### SCHEMA-ONLY BACKUPS ### 74 | ########################### 75 | 76 | for SCHEMA_ONLY_DB in ${SCHEMA_ONLY_LIST//,/ } 77 | do 78 | SCHEMA_ONLY_CLAUSE="$SCHEMA_ONLY_CLAUSE or datname ~ '$SCHEMA_ONLY_DB'" 79 | done 80 | 81 | SCHEMA_ONLY_QUERY="select datname from pg_database where false $SCHEMA_ONLY_CLAUSE order by datname;" 82 | 83 | echo -e "\n\nPerforming schema-only backups" 84 | echo -e "--------------------------------------------\n" 85 | 86 | SCHEMA_ONLY_DB_LIST=`psql -U "$USERNAME" -At -c "$SCHEMA_ONLY_QUERY" postgres` 87 | 88 | echo -e "The following databases were matched for schema-only backup:\n${SCHEMA_ONLY_DB_LIST}\n" 89 | 90 | for DATABASE in $SCHEMA_ONLY_DB_LIST 91 | do 92 | echo "Schema-only backup of $DATABASE" 93 | 94 | if ! pg_dump -Fp -s -U "$USERNAME" "$DATABASE" | gzip > $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz.in_progress; then 95 | echo "[!!ERROR!!] Failed to backup database schema of $DATABASE" 1>&2 96 | else 97 | mv $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz.in_progress $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz 98 | fi 99 | done 100 | 101 | 102 | ########################### 103 | ###### FULL BACKUPS ####### 104 | ########################### 105 | 106 | for SCHEMA_ONLY_DB in ${SCHEMA_ONLY_LIST//,/ } 107 | do 108 | EXCLUDE_SCHEMA_ONLY_CLAUSE="$EXCLUDE_SCHEMA_ONLY_CLAUSE and datname !~ '$SCHEMA_ONLY_DB'" 109 | done 110 | 111 | FULL_BACKUP_QUERY="select datname from pg_database where not datistemplate and datallowconn $EXCLUDE_SCHEMA_ONLY_CLAUSE order by datname;" 112 | 113 | echo -e "\n\nPerforming full backups" 114 | echo -e "--------------------------------------------\n" 115 | 116 | for DATABASE in `psql -U "$USERNAME" -At -c "$FULL_BACKUP_QUERY" postgres` 117 | do 118 | if [ $ENABLE_PLAIN_BACKUPS = "yes" ] 119 | then 120 | echo "Plain backup of $DATABASE" 121 | 122 | if ! pg_dump -Fp -U "$USERNAME" "$DATABASE" | gzip > $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress; then 123 | echo "[!!ERROR!!] Failed to produce plain backup database $DATABASE" 1>&2 124 | else 125 | mv $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress $FINAL_BACKUP_DIR"$DATABASE".sql.gz 126 | fi 127 | fi 128 | 129 | if [ $ENABLE_CUSTOM_BACKUPS = "yes" ] 130 | then 131 | echo "Custom backup of $DATABASE" 132 | 133 | if ! pg_dump -Fc -U "$USERNAME" "$DATABASE" -f $FINAL_BACKUP_DIR"$DATABASE".custom.in_progress; then 134 | echo "[!!ERROR!!] Failed to produce custom backup database $DATABASE" 135 | else 136 | mv $FINAL_BACKUP_DIR"$DATABASE".custom.in_progress $FINAL_BACKUP_DIR"$DATABASE".custom 137 | fi 138 | fi 139 | 140 | done 141 | 142 | echo -e "\nAll database backups complete!" 143 | } 144 | 145 | # MONTHLY BACKUPS 146 | 147 | DAY_OF_MONTH=`date +%d` 148 | 149 | if [ $DAY_OF_MONTH -eq 1 ]; 150 | then 151 | # Delete all expired monthly directories 152 | find $BACKUP_DIR -maxdepth 1 -name "*-monthly" -exec rm -rf '{}' ';' 153 | 154 | perform_backups "-monthly" 155 | 156 | exit 0; 157 | fi 158 | 159 | # WEEKLY BACKUPS 160 | 161 | DAY_OF_WEEK=`date +%u` #1-7 (Monday-Sunday) 162 | EXPIRED_DAYS=`expr $((($WEEKS_TO_KEEP * 7) + 1))` 163 | 164 | if [ $DAY_OF_WEEK = $DAY_OF_WEEK_TO_KEEP ]; 165 | then 166 | # Delete all expired weekly directories 167 | find $BACKUP_DIR -maxdepth 1 -mtime +$EXPIRED_DAYS -name "*-weekly" -exec rm -rf '{}' ';' 168 | 169 | perform_backups "-weekly" 170 | 171 | exit 0; 172 | fi 173 | 174 | # DAILY BACKUPS 175 | 176 | # Delete daily backups 7 days old or more 177 | find $BACKUP_DIR -maxdepth 1 -mtime +$DAYS_TO_KEEP -name "*-daily" -exec rm -rf '{}' ';' 178 | 179 | perform_backups "-daily" 180 | -------------------------------------------------------------------------------- /cron/richard_update_index.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Usage: 4 | # $ richard_update_index.sh 5 | 6 | cd /srv/richardsite/richard/ && ./run_manage.sh update_index 7 | -------------------------------------------------------------------------------- /staticbase/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyvideo/old-pyvideo/7eaa9fa847818b6a1879cc41b3cfc30b24d6d8eb/staticbase/favicon.ico -------------------------------------------------------------------------------- /templates/404.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 | 4 |
5 |
6 |
 7 |         _  _    ___  _  _   _ 
 8 |        | || |  / _ \| || | | |
 9 |        | || |_| | | | || |_| |
10 |        |__   _| |_| |__   _|_|
11 |           |_|  \___/   |_| (_)
12 | 
13 | 
14 |            ?      ?    ?
15 |      ___  ?    ?         ? ___
16 |     / _ \  ?   .---.    ? / _ \
17 |     \/_) )   _|o__  |_    \/_) )
18 |      / ,-   '       | '    / ,-'
19 |      '-'   (   .----'  )   '-'
20 |      (_)    '_|   ____'    (_)  
21 |               |   o |   
22 |                '---'
23 | 
24 |           WHERE MY PYTHONS
25 |              AT?!!!?!!
26 | 
27 |
28 |
29 |

Gah!

30 |

31 | Gah! Somehow you ended up on a page that's not handled 32 | anywhere. I really apologize for this. 33 |

34 | 35 |

What happens now?

36 |

37 | I don't watch for 404 errors, so the best thing for you to 38 | do is fire off an email to me at willg at bluesock dot org 39 | with the url you're trying to go to and any information you 40 | think is relevant to how you got there. 41 |

42 |

43 | I'll respond within a week. I'll probably either fix it immediately 44 | or write up a bug report and fix it later. 45 |

46 |

47 | In the meantime, you can go back to 48 | the home page. 49 |

50 |
51 |
52 | {% endblock %} 53 | -------------------------------------------------------------------------------- /templates/500.html: -------------------------------------------------------------------------------- 1 | 2 | 500 error 3 | 4 |

500 error

5 |

6 | Gah! Something happened that wasn't handled properly in the 7 | code. I really apologize for this. 8 |

9 | 10 |

What happens now?

11 |

12 | An email with the error, the traceback, and some context 13 | was sent to the site admin. At some point in the next few days 14 | the email will be looked at. At that point, the site admin 15 | will create an issue in either the 16 | pyvideo.org issue tracker 17 | or the 18 | richard issue tracker 19 | depending on whether the problem is with pyvideo.org or with richard. 20 | Then—assuming all goes well—the issue will be fixed and the 21 | fix deployed. 22 |

23 | 24 |

What should you do now?

25 |

26 | It's probably the case that if you refresh this page, you'll just hit 27 | the error again. I suggest doing something else on the site and/or 28 | coming back again in a day or two. 29 |

30 |

31 | Here's a link to the home page. 32 |

33 | 34 | 35 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | # richard -- video index system 3 | # Copyright (C) 2012 richard contributors. See AUTHORS. 4 | # 5 | # This program is free software: you can redistribute it and/or modify 6 | # it under the terms of the GNU Affero General Public License as published by 7 | # the Free Software Foundation, either version 3 of the License, or 8 | # (at your option) any later version. 9 | # 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU Affero General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU Affero General Public License 16 | # along with this program. If not, see . 17 | {% endcomment %} 18 | {% load browserid %} 19 | {% load md %} 20 | {% load page_title %} 21 | {% load url from future %} 22 | {% load staticfiles %} 23 | 24 | 25 | 26 | 27 | 28 | {% browserid_css %} 29 | 30 | {% block title %}{% page_title 'Home' %}{% endblock %} 31 | 32 | {% if meta %} 33 | {% for meta_name, meta_content in meta %} 34 | 35 | {% endfor %} 36 | {% endif %} 37 | {% block additional_head %}{% endblock %} 38 | 39 | 40 | {% csrf_token %} 41 | {% browserid_info %} 42 | 43 | 92 | 93 |
94 | {% if notifications %} 95 |
96 |
97 | {% for n in notifications %} 98 |
99 | {{ n.interjection }} 100 | {{ n.text|md|safe }} 101 |
102 | {% endfor %} 103 |
104 |
105 | {% endif %} 106 | 107 | {% block content %}{% endblock %} 108 | 109 | {% block footer %} 110 | 140 | {% endblock footer %} 141 | 142 |
143 | 144 | {% block additional_body %}{% endblock %} 145 | 146 | {% block site_js %} 147 | 148 | 149 | {% browserid_js %} 150 | 161 | {% endblock site_js %} 162 | 163 | 164 | -------------------------------------------------------------------------------- /templates/home_branded.html: -------------------------------------------------------------------------------- 1 | {% extends "home.html" %} 2 | {% comment %} 3 | # richard -- video index system 4 | # Copyright (C) 2012 richard contributors. See AUTHORS. 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU Affero General Public License as published by 8 | # the Free Software Foundation, either version 3 of the License, or 9 | # (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU Affero General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU Affero General Public License 17 | # along with this program. If not, see . 18 | {% endcomment %} 19 | {% block contenthero %} 20 |
21 |

{{ settings.SITE_TITLE }}

22 |

23 | Python related video indexed so you can find it. 24 | {{ video_count }} video{{ video_count|pluralize }} so far. 25 | Learn more 26 |

27 |
28 | {% endblock %} 29 | -------------------------------------------------------------------------------- /templates/pages/about.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 | 4 | 7 | 8 |
9 |
10 |

11 | This is a video index of Python-related video on the Internet. 12 | It does not host video—it's an index. 13 |

14 |

15 | Each video is lovingly packaged with a variety of metadata that 16 | comprises the context of the video: When was it taken? What was 17 | the venue? Who was speaking? What was the topic of the talk? 18 | What are the related links? Are there quality issues with the 19 | video? 20 |

21 |

22 | It's our hope that this metadata brings the video that's 23 | currently scattered about easier to find and easier to use. 24 |

25 | 26 |
27 |

Want to add a new conference?

28 |

29 | Toss an issue in the 30 | issue tracker. 31 |

32 |

33 | I'm working on making it easier for other people to add new 34 | conferences to the site so that I'm not the bottleneck, but 35 | that work hasn't landed, yet. 36 |

37 |
38 | 39 |
40 |

Found a problem with the data?

41 |

42 | If you've found a problem with the data in pyvideo.org, send 43 | me an email with the details (the more details, the better). 44 | Email me at willkg at bluesock dot org. 45 |

46 |
47 | 48 |
49 |

Found a bug with the software?

50 |

51 | If you've found a bug in richard, then please write up an 52 | issue 53 | in the 54 | issue tracker. 55 |

56 |
57 | 58 |
59 |

Want to contribute?

60 |

61 | If you want to contribute to this site, you'll have to wait 62 | a bit until we get a contributor infrastructure going. I 63 | really want to make it easy for people to help make the 64 | metadata better, but the code isn't there, yet. 65 |

66 |

67 | If you want to contribute to the software, see 68 | http://richard.readthedocs.org/en/latest/. 69 |

70 |
71 | 72 |
73 |

Do you have other questions, comments, or concerns?

74 |

75 | In the meantime, if you have questions, comments or concerns 76 | about this site, want to help out with richard development, 77 | or just want to send encouraging words, then send me an 78 | email. 79 |

80 |
81 | 82 |
83 |

Is this site helpful to you? Do you want to tip us for the work 84 | we're doing?

85 |

86 | We work on pyvideo in our free time. That covers development 87 | of richard (the software that powers pyvideo and other video 88 | indexing sites), maintaining infrastructure, fixing issues 89 | with the data and adding new conferences. It may not look like 90 | much, but it's a lot of work. 91 |

92 |

93 | We had Gratipay links, but rarely (if at all) got anyone 94 | tipping, so we removed them. 95 |

96 |

97 | If pyvideo is important to you and you want to encourage more 98 | development/work on it, you should show you care. Send Will an email 99 | at willkg at bluesock dot org. 100 |

101 |
102 | 103 |
104 |

How is this site put together?

105 |

106 | The software that runs this site is called richard. It's a free 107 | software project. You can find the code on GitHub at 108 | http://github.com/pyvideo/richard. 109 |

110 |

111 | The software that we use to work on the metadata and add it to 112 | pyvideo.org is called steve. It's also a free software project. 113 | You can find the code on GitHub at 114 | http://github.com/pyvideo/steve. 115 | Steve is very much an "in-progress" project and gets adjusted 116 | as our needs dictate. 117 |

118 |
119 | 120 |
121 |

Future plans

122 |
    123 |
  • Done!: Better feed support 124 |
  • Done!: Read-only API 125 |
  • Better subtitling support whether that's through Universal 126 | Subtitles or something else 127 |
  • Better metadata 128 |
  • Better browsing interface 129 |
  • Better search interface 130 |
131 |

132 | Most of these are being worked on in the underlying 133 | software. See richard 134 | issue tracker for details. 135 |

136 |

137 | Additionally, the data in pyvideo.org is ok, but could be a lot 138 | better. We're working on improving that, making it easier for 139 | other people to improve it, and adding additional conferences to 140 | the index. 141 |

142 |
143 | 144 |
145 |

Thank you!

146 |

147 | We want to thank: 148 |

149 |
    150 |
  • richard 151 | development team for building the software that runs this 152 | site 153 |
  • 154 | 155 |
  • Rackspace 156 | for graciously hosting pyvideo. 157 |
  • 158 | 159 |
  • Participatory Culture 160 | Foundation for putting together 161 | Miro Community 162 | which got me started curating Python video 163 |
  • 164 | 165 |
  • Carl and Ryan at Next 166 | Day Video and the video teams that have filmed a large 167 | majority of this video over the years—the work they 168 | do is magical and they're great to work with 169 |
  • 170 | 171 |
  • Python Software 172 | Foundation for the grant they awarded me in 2011 that 173 | paid costs I was accruing with Python Miro Community and 174 | for being so supportive of my efforts like they are with 175 | the many others who volunteer for Python community things 176 |
  • 177 | 178 |
  • Mozilla for hiring me 179 | and bringing me back to web development and also building a 180 | lot of the libraries I used on the site 181 |
  • 182 | 183 |
  • the people who put together these conferences—it's a 184 | metric ton of work that goes into bringing so many people 185 | together under one roof to be together, learn, and share 186 |
  • 187 |
188 |
189 |
190 |
191 | {% endblock %} 192 | --------------------------------------------------------------------------------