Python練習題(三)--視頻展示網(wǎng)站

題目

來源:優(yōu)達學(xué)城--編程基礎(chǔ):python
內(nèi)容:尋找自己喜歡的視頻振愿,做成網(wǎng)站展示出來
效果演示:

image.png

image.png

源代碼

主要有三個.py文件,放到一個文件夾中档桃,運行 entertainment_center.py 即可藻肄。(需要python環(huán)境)
源碼地址 : Python-Exercies
網(wǎng)站地址 : 視頻展示網(wǎng)站

其他

對優(yōu)達源碼做了改動嘹屯,支持多種視頻格式州弟,導(dǎo)入codecs包,寫入html支持中文拯杠。
無法觀看的是嵌入youtube視頻(翻墻即可)潭陪。

附源碼
entertainment_center.py

# -*- coding: utf-8 -*-
import media
import fresh_tomatoes

overwatch = media.Movie("Overwatch","守望者們回歸",
    "http://overwatch.nos.netease.com/2/media/Wallpapers/Genji_wallpaper/2048x2048.jpg",
    "http://flv.bn.netease.com/videolib3/1506/26/cJtFW2189/HD/cJtFW2189-mobile.mp4")

school_of_rock = media.Movie("School of Rock"," Using rock music to learn",
    "http://upload.wikimedia.org/wikipedia/en/thumb/1/11/School_of_Rock_Poster.jpg/220px-School_of_Rock_Poster.jpg",
    "https://www.youtube.com/watch?v=3PsUJFEBC74")

spider_gay = media.Movie("美隊3 內(nèi)戰(zhàn)","搞笑蜘蛛俠",
    "http://p1.ifengimg.com/a/2016_19/ea0b92b08ab62d2_size47_w550_h275.jpg",
    "https://www.youtube.com/watch?time_continue=16&v=Wa5yWjsjGoI")

overwatch2 = media.Movie("雙龍","雙龍",
    "http://overwatch.nos.netease.com/2/media/videos/dragons-animated-short.jpg",
    "http://flv.bn.netease.com/videolib3/1605/16/nTaMi2329/HD/nTaMi2329-mobile.mp4")

overwatch3 = media.Movie("虛幻爭霸","虛幻爭霸試玩",
    "https://i.ytimg.com/vi/l-TAaE5raeU/hqdefault.jpg",
    "https://www.youtube.com/watch?v=l-TAaE5raeU")

overwatch4 = media.Movie("LOL","盤點lol最強操作",
    "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSLfycX_SZr4pT-UVddhr0FdcN67cX1rwFM21PPH3glYPETzGtT",
    "http://r.plures.net/plu/tplayer/video-iath80mu.swf?vid=w0162pdtuoi&auto=1")

movies = [overwatch, school_of_rock, spider_gay, overwatch2, overwatch3, overwatch4]
fresh_tomatoes.open_movies_page(movies)
#print(media.Movie.__name__)
#print(media.Movie.__module__)
#print(media.Movie.__doc__)

fresh_tomatoes.py

# -*- coding: utf-8 -*-
import codecs
import webbrowser
import os
import re


# Styles and scripting for the page
main_page_head = '''
<!DOCTYPE html>s
<html lang="zh_CN">
<head>
    <meta charset="utf-8">
    <title>Fresh Tomatoes!</title>

    <!-- Bootstrap 3 -->
    <link rel="stylesheet" >
    <link rel="stylesheet" >
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
    <script src="https://netdna.bootstrapcdn.com/bootstrap/3.1.0/js/bootstrap.min.js"></script>
    <style type="text/css" media="screen">
        body {
            padding-top: 80px;
        }
        #trailer .modal-dialog {
            margin-top: 200px;
            width: 640px;
            height: 480px;
        }
        .hanging-close {
            position: absolute;
            top: -12px;
            right: -12px;
            z-index: 9001;
        }
        #trailer-video {
            width: 100%;
            height: 100%;
        }
        .movie-tile {
            margin-bottom: 20px;
            padding-top: 20px;
        }
        .movie-tile:hover {
            background-color: #EEE;
            cursor: pointer;
        }
        .scale-media {
            padding-bottom: 56.25%;
            position: relative;
        }
        .scale-media iframe {
            border: none;
            height: 100%;
            position: absolute;
            width: 100%;
            left: 0;
            top: 0;
            background-color: white;
        }
    </style>
    <script type="text/javascript" charset="utf-8">
        // Pause the video when the modal is closed
        $(document).on('click', '.hanging-close, .modal-backdrop, .modal', function (event) {
            // Remove the src so the player itself gets removed, as this is the only
            // reliable way to ensure the video stops playing in IE
            $("#trailer-video-container").empty();
        });
        // Start playing the video whenever the trailer modal is opened
        $(document).on('click', '.movie-tile', function (event) {
            var trailerYouTubeId = $(this).attr('data-trailer-youtube-id');
            var sourceUrl = trailerYouTubeId ;
            $("#trailer-video-container").empty().append($("<iframe></iframe>", {
              'id': 'trailer-video',
              'type': 'text-html',
              'src': sourceUrl,
              'frameborder': 0
            }));
        });
        // Animate in the movies when the page loads
        $(document).ready(function () {
          $('.movie-tile').hide().first().show("fast", function showNext() {
            $(this).next("div").show("fast", showNext);
          });
        });
    </script>
</head>
'''


# The main page layout and title bar
main_page_content = '''
  <body>
    <!-- Trailer Video Modal -->
    <div class="modal" id="trailer">
      <div class="modal-dialog">
        <div class="modal-content">
          <a href="#" class="hanging-close" data-dismiss="modal" aria-hidden="true">
            ![](https://lh5.ggpht.com/v4-628SilF0HtHuHdu5EzxD7WRqOrrTIDi_MhEG6_qkNtUK5Wg7KPkofp_VJoF7RS2LhxwEFCO1ICHZlc-o_=s0#w=24&h=24)
          </a>
          <div class="scale-media" id="trailer-video-container">
          </div>
        </div>
      </div>
    </div>

    <!-- Main Page Content -->
    <div class="container">
      <div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
        <div class="container">
          <div class="navbar-header">
            <a class="navbar-brand" href="#">Fresh Tomatoes Movie Trailers</a>
          </div>
        </div>
      </div>
    </div>
    <div class="container">
      {movie_tiles}
    </div>
  </body>
</html>
'''


# A single movie entry html template
movie_tile_content = '''
<div class="col-md-6 col-lg-4 movie-tile text-center" data-trailer-youtube-id="{trailer_youtube_id}" data-toggle="modal" data-target="#trailer">
    ![]({poster_image_url})
    <h2>{movie_title}</h2>
</div>
'''


def create_movie_tiles_content(movies):
    # The HTML content for this section of the page
    content = ''
    for movie in movies:
        # Extract the youtube ID from the url
        youtube_id_match = re.search(
            r'(?<=v=)[^&#]+', movie.trailer_url)
        if youtube_id_match:
            youtube_id_match = 'http://www.youtube.com/embed/' + youtube_id_match.group(0) + '?autoplay=1&html5=1';
        else :
            youtube_id_match = movie.trailer_url
        trailer_youtube_id = youtube_id_match 

        # Append the tile for the movie with its content filled in
        content += movie_tile_content.format(
            movie_title=movie.title,
            poster_image_url=movie.poster_image_url,
            trailer_youtube_id=trailer_youtube_id
        )
    return content


def open_movies_page(movies):
    # Create or overwrite the output file
    output_file = codecs.open('fresh_tomatoes.html', 'w',encoding='utf-8')
    

    # Replace the movie tiles placeholder generated content
    rendered_content = main_page_content.format(
        movie_tiles=create_movie_tiles_content(movies))

    # Output the file
    output_file.write(main_page_head + rendered_content)
    output_file.close()

    # open the output file in the browser (in a new tab, if possible)
    url = os.path.abspath(output_file.name)
    webbrowser.open('file://' + url, new=2)

media.py

import webbrowser

class Movie():
    """This class provides a way to store movie related information """

    VALID_RATINGS = ["G", "PG", "PG-13", "R"]
    def __init__(self, movie_title, movie_storyline, poster_image, trailer):
        self.title = movie_title
        self.storyline = movie_storyline
        self.poster_image_url = poster_image
        self.trailer_url = trailer

    def show_trailer(self):
        webbrowser.open(self.trailer_url)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洪添,隨后出現(xiàn)的幾起案子干奢,更是在濱河造成了極大的恐慌忿峻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绰寞,死亡現(xiàn)場離奇詭異铣口,居然都是意外死亡,警方通過查閱死者的電腦和手機件缸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門争剿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秒梅,“玉大人舌胶,你說我怎么就攤上這事幔嫂÷亩鳎” “怎么了切心?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵绽昏,是天一觀的道長。 經(jīng)常有香客問我俏脊,道長全谤,這世上最難降的妖魔是什么盾鳞? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任颓帝,我火速辦了婚禮,結(jié)果婚禮上酌伊,老公的妹妹穿的比我還像新娘漫萄。我一直安慰自己卷员,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布腾务。 她就那樣靜靜地躺著毕骡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挺峡。 梳的紋絲不亂的頭發(fā)上箫津,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天赡模,我揣著相機與錄音叨吮,去河邊找鬼锋玲。 笑死割粮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的榜轿。 我是一名探鬼主播诚些,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼幢痘,長吁一口氣:“原來是場噩夢啊……” “哼购岗!你這毒婦竟也來了玄妈?” 一聲冷哼從身側(cè)響起溶弟,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阁谆,沒想到半個月后嫉入,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垫竞,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡遣鼓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年粉怕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡赏廓,死狀恐怖既忆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤彰亥,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站墨辛,受9級特大地震影響太惠,放射性物質(zhì)發(fā)生泄漏凿渊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一嗽元、第九天 我趴在偏房一處隱蔽的房頂上張望淤翔。 院中可真熱鬧,春花似錦麦撵、人聲如沸音五。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伯病。三九已至,卻和暖如春否过,著一層夾襖步出監(jiān)牢的瞬間午笛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工苗桂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留药磺,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓煤伟,卻偏偏與公主長得像癌佩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子便锨,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,787評論 25 707
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,454評論 6 428
  • 從小我就很崇拜作家围辙,我覺得他們的方寸文字影響了萬千世人,像簡愛放案,平凡的世界姚建,像莎士比亞,張愛玲吱殉,透過文字讓我...
    梓嶺金草閱讀 228評論 0 5
  • 隨機函數(shù) 當前時間戳函數(shù)
    CoderChou閱讀 1,347評論 0 1
  • 我有一個小寶寶掸冤,今年已經(jīng)上大班。其實考婴,她已經(jīng)是個大孩子了贩虾,她聰明伶俐,她善良聽話沥阱,她懂事缎罢。她愛跳舞,唱歌、鋼琴策精、畫...
    林叮咚閱讀 225評論 0 1