用 Python+nginx+django 打造在线家庭影院

2018年11月29日 08:46:59 清如許 阅读数:1528
 

我喜欢看电影,尤其是好的电影,我会看上三四遍,仔细感受电影带给我的另一种人生体验,不同时期,不同年龄段看相同的电影,体验也会不一样。比如你上学时期看周星驰的电影可能就仅看到了笑点,工作之年之后再看,也许你会觉得这蕴含着深刻的人生哲理。

以前下载的电影,放的到处都是,手机上,U 盘里,平板,台式机,笔记本上都保存有下载过的电影,而且有时候平板或手机空间不够,就不得不删除珍藏已久的电影,很是可惜。当要看电影时,一时却找不到自己曾下载过的电影,于是又在网上搜索,但是随着版权越来越被重视,看视频都要会员,或者付费观看(这一点是进步的,只有这样才会有更好的作品呈现。),没有会员就要忍受非常烦人的广告,而且未必是高清资源。想想曾经下载过的电影删除了,现在看可能要收费了,很是遗憾。

如果电影可以统一放在廉价的台式机硬盘上,再开启一个视频流服务器能让所有的联网设备直接在线播放就好了,这样就不用担心下载过的电影无法找到了,而且觉得好的电影可以随时推荐给家人和朋友观看。

我知道 Python 是可以干这个事情的,说干就干,当天晚上就做好了一个 demo。【如果你也有个想法想实现,那么请即刻行动起来,如果超过 72 个小时还没行动,你很可能再也不会去做了】

技术栈:python、django、nginx

感兴趣的和我一起动手做吧。以 windows 操作系统为例,其他系统可做参考。

1、下载并配置 nginx

nginx 是什么?

Nginx (“engine x”) 是一款是由俄罗斯的程序设计师 Igor Sysoev 所开发高性能的 Web 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。在高连接并发的情况下,Nginx 是 Apache 服务器不错的替代品。

这里主要用 nginx 将 mp4 文件转化为流媒体,这样就可以直接在网页上播放 mp4 格式的电影,只需要简单的配置即可,不需要编写代码,非常简单。

登陆官网下载 nginx:https://nginx.org/en/download.html,下载如下图所示的稳定版本,解压即可使用。

修改 nginx.conf ,在 http 部分添加如下所示的部分。

    server {
listen 8080;
server_name localhost;
location /movie {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
proxy_pass http://127.0.0.1:8000/movie;
}
location ~ \.mp4{
autoindex on;
root E:\\media;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

其中

        location ~ \.mp4{
autoindex on;
root E:\\media;
}
  • 1
  • 2
  • 3
  • 4

的作用是将 mp4 文件转化为流媒体的,只需要这一段,你就可以在浏览器上播放电影了,比如我在E:\media\ytza[迅雷下载Www.99b.Cc]伊甸湖BD1024高清中英双字.mp4,我就可以在地址栏按下图所示的内容:

是不是有点小兴奋。

但是,你不可能记得每一个电影名称和路径,nginx 虽然也可能列出文件列表,但涉及到中文就会乱码,而且不太容易解决,这就需要简单的编程来解决文件路径显示的问题。接下来看 2。

2、使用 Django 显示本地电影列表

Django 是什么,相信你会想起电影《被解救的姜戈》,Django 就是读姜戈,第一个 D 不发音。

Python下有许多款不同的 Web 框架。Django 是重量级选手中最有代表性的一位。许多成功的网站和APP都基于 Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django 采用了 MVC 的软件设计模式,即模型 M,视图 V 和控制器 C。

Python 是什么就不用介绍了,下面直接展示如何使用 django 快速生成一个网站。
在命令窗口依次执行下面的命令:

pip install django
django-admin startproject mysite
cd mysite
python manage.py startapp movie
  • 1
  • 2
  • 3
  • 4

1、编辑 movie 目录下的 views 文件如下所示:

from django.shortcuts import render
import os
# Create your views here. FILE_HOME_DIR = "e:/media/"
MEDIA = [ ".mp4",] def movie_list(request):
next = request.GET.get("next", '')
print(f"next = {next}")
path = "/".join(request.path.split("/")[2:])
print(f"request.path= {request.path}")
print(f"path = {path}") #print os.listdir(FILE_HOME_DIR+".none/")
data = {"files":[], "dirs":[]}
print(data)
child_path = FILE_HOME_DIR+path+next
print(f"child_path = {child_path}")
data['cur_dir'] = path+next
print(data)
for dir in os.listdir(child_path):
if os.path.isfile(child_path+"/"+dir):
if os.path.splitext(dir)[1] in MEDIA:
data['files'].append(dir)
else:
data['dirs'].append(dir) print(data)
return render(request,"movie/index.html", data)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

2、在 movie 目录下新建 templates/movie 文件夹,添到文件 index.html,内容如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>电影列表</title>
</head>
<body>
<ul>
{% for dir in dirs%}
<li style="color: #462921;font-size: 20px;">
{{ dir }} <a href="/movie/{{ cur_dir|safe }}/?next={{ dir|safe }}">进入</a>
</li>
{% endfor %}
{% for file in files%}
<li style="margin-right: 20px;font-size: 20px;">
{{ file }} <button><a href="/{{ cur_dir|safe }}/{{ file|safe }}" target="_blank">播放</a></button>
</li>
{% endfor %}
</ul> </body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3、修改 mysite/urls.py 内容如下:

from django.conf.urls import include,url
from django.contrib import admin urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^movie/', include('movie.urls')),
url(r'^admin/', admin.site.urls),
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4、在movie 文件夹下添加 urls.py 内容如下:

from django.conf.urls import include,url
from . import views
app_name = 'movie'
urlpatterns = [
url(r'', views.movie_list, name="movie"),
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5、修改 settings.py 下列内容的值

INSTALLED_APPS = [
'movie.apps.MovieConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
ALLOWED_HOSTS = ['*']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

上述步骤对应的文件如下图所示:

其他保持默认即可。
接着在 manage.py 所在的文件夹内,也就是 mysite 目录内执行

python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
  • 1
  • 2
  • 3

即可启动会显示电影列表的网站,如下图所示:

此时 nginx 的这段代码就发挥作用了

        location /movie {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
proxy_pass http://127.0.0.1:8000/movie;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

只要输入 127.0.0.1:8080/movie 就会自动转到 http://127.0.0.1:8000/movie 的服务上,这样你就看到了电影的目录,当点击对应的 mp4 文件时,nginx 自动转成流媒体为你播放。

在别的终端上看时,直接输入服务器所在的 IP 地址即可,如下图所示:

有同学可能会问了,如果电影不是 mp4 格式的呢? 由于 html5 仅支持直接播放 mp4 ,我想到的办法就是使用 ffmpeg.exe 将其他非 mp4 格式的电影转成 mp4,代码已经为你写好了,直接使用即可。
movie2mp4.py

# -*- coding: utf-8 -*-
#!/usr/local/bin/python
# Time: 2017/8/30 22:17:47
# Description:
# File Name: movie2mp4.py import os
import subprocess
import time
import logging logger = logging.getLogger()
logger.setLevel(logging.INFO)
ch = logging.StreamHandler()
fh = logging.FileHandler(filename="./convert.log")
formatter = logging.Formatter(
"%(asctime)s - %(name)s - line:%(lineno)d - %(levelname)s - %(message)s"
)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(ch) # 将日志输出至屏幕
logger.addHandler(fh) # 将日志输出至文件 movie_path = r"e:\media"
movie_type = [".mkv", ".rmvb", ".avi",".flv",".MKV", ".RMVB", ".AVI",".FLV"] for root, dir, files in os.walk(movie_path):
for file in files:
# print(file)
shotname, extension = os.path.splitext(file)
# print(shotname,extension)
source_name = os.path.join(root, file)
target_name = os.path.join(root, f"{shotname}.mp4")
if extension in movie_type and not os.path.exists(target_name):
logger.info(f"{source_name} -> {target_name}")
bin_path = (
r"D:\program\ffmpeg-20170830-2b9fd15-win64-static\bin\ffmpeg.exe"
)
#command = f"{bin_path} -i {source_name} -strict -2 {target_name}"
command = f"{bin_path} -i {source_name} -c:v copy -c:a copy {target_name}"
logger.info(command)
try:
a = subprocess.run(command, shell=True)
if a.returncode == 0:
logger.info("convert successful.")
b = subprocess.run(f"del {source_name}", shell=True)
if b.returncode == 0:
logger.info("delete source successful.")
except Exception as e:
logger.info(f"conver error :{e}")
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

这样就可以愉快的享受自己搭建的家庭影院了。

原链接

https://blog.csdn.net/somezz/article/details/84611333

用 Python+nginx+django 打造在线家庭影院的更多相关文章

  1. Django+xadmin打造在线教育平台(二)

    三.xadmin后台管理 3.1.xadmin的安装 django2.0的安装(源码安装方式): https://github.com/sshwsfc/xadmin/tree/django2 把zip ...

  2. Django+xadmin打造在线教育平台(三)

    五.完成注册.找回密码和激活验证码功能 5.1.用户注册 register.html拷贝到templates目录 (1)users/views.py class RegisterView(View): ...

  3. Django+xadmin打造在线教育平台(一)

    目录 在线教育平台(一)      在线教育平台(二) 在线教育平台(三)      在线教育平台(四) 在线教育平台(五)      在线教育平台(六) 在线教育平台(七)      在线教育平台( ...

  4. 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

    第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...

  5. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  6. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  7. Nginx+Python+uwsgi+Django的web开发环境安装及配置

    Nginx+Python+uwsgi+Django的web开发环境安装及配置 nginx安装 nginx的安装这里就略过了... python安装 通常系统已经自带了,这里也略过 uwsgi安装 官网 ...

  8. centos6.5安装nginx+python+uwsgi+django

    nginx+uwsgi+django环境部署及测试 默认系统自带的python2.6.6 第一步(安装setuptools) wget https://pypi.python.org/packages ...

  9. 第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

    第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到 ...

随机推荐

  1. jQuery 插件使用记录

    Validate 表单验证 ver 1.6 浏览更多 默认情况下,当表单 submit 时,那些验证不通过的 field 旁边会出现错误消息提示,有时很方便,但有时看起来很不美观.可以关闭此消息提示. ...

  2. Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享

    Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享 支付宝十年账单上的数字有点吓人,但它统计的项目太多,只是想看看到底单纯在淘宝上支出了多少,于是写了段脚本,统计任意时间段淘宝订单的消费情况,看 ...

  3. 文件权限命令 linux

    chmod 777 文件名/文件夹名         拥有所有权限 http://www_xpc8_com/ chmod 755 文件名/文件夹名         属主有所有权限,群组和其他有读.执行 ...

  4. linux安装mysql~~~mysql5.6.12

    Linux安装mysql服务器 准备: MySQL-client-5.6.12-1.rhel5.i386.rpm MySQL-server-5.6.12-1.rhel5.i386.rpm 首先检查环境 ...

  5. HDU 2095 find your present (2) (异或)

    题意:给定n个数,让你找出那一个次数为1的. 析:由于题意说了,只有那一个数是奇数,所以其他的都是偶数,根据异或的性质,两个相同的数异或为0: 任何数和0异或得原数,可以很简单的做出这个题. 代码如下 ...

  6. 关于RabbitMQ一点

    RabbitMQ是AMQP(高级消息队列协议)的标准实现,理论上可以保证消息发送的准确性 RabbitMQ是用Erlang语言编写的,而Erlang语言具有以下特点: 并发性--Erlang支持超大量 ...

  7. jmap的几个操作要慎用

    JDK中带有了一堆的工具是可以用来查看运行状况,排查问题的,但对于这些工具还是要比较清楚执行后会发生什么,否则有可能会因为执行了一个命令就导致严重故障,重点讲下影响比较大的jmap. 最主要的危险操作 ...

  8. hdu 4995 离线处理+模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4995 给定一维坐标下的n个点,以及每个点的权值,有m次查询,每次将查询的x点上的权值修改为离x最近的k个点权值的 ...

  9. ALIZE初涉

    ALIZE初涉 在做GMM-UBM和i-vector时都用到了ALIZE,不得不说十分良心,在linux下很方便,但同时也有一些问题,流程总结如下 安装 在http://alize.univ-avig ...

  10. mysql的sql性能分析器

    MySQL 的SQL性能分析器主要用途是显示SQL执行的整个过程中各项资源的使用情况.分析器可以更好的展示出不良SQL的性能问题所在. mysql sql profile的使用方法 1.开启mysql ...