Linux サーバにある動画をiPhoneから選択+再生するphpファイルを作った。
こうなる。
「再生」ボタンで動画再生。
「別窓再生」を押せば右下の小窓で音声だけループ再生する。
動画の番号はbootstrap4のbadge機能で採番する。
右上のハンバーガーメニューからは別ページに飛べる。
動画だけで1000近くあるので自動で5ページに分ける(ページング)をphpで実装している。
拡張子がmp4ではないもの(tsやmkv)は「変換」ボタンでmp4に変換(サーバ側でHandBrakeCLIを動かす)したいが、まだ未実装。
横画面でも動く。
bootstrap4のカード機能を使っているので動画どうしが綺麗に隣り合って横に並ぶ。
これを、拡張子.phpのファイル1つで実装する。。htmlとcssを分けたりしない。jsを別ファイルにしたりもしない。ファイル数が増えると可搬性が悪くなるから。できるだけファイル1枚で済ます(ただしbootstrapのcssだけはインポートしている)。
ソースはこれ。
コピペ用
?php
//エラーをhtml上に吐く
ini_set( 'display_errors', 1);
//記述上のエンコードを指定
mb_internal_encoding("UTF-8");
//表示上のエンコード指定header
header("Content-Type: text/html; charset=UTF-8");
// 後で呼ぶ関数の中で使う変数を定義
$DATE = date("Ymd_His");
$FILENAME = $DATE;
// print '<font size="6" color="blue">';
// print "実行日時: $FILENAME<br>";
define('SCRIPT_DIR', dirname($_SERVER['SCRIPT_FILENAME']));
// print SCRIPT_DIR;
// GETの中身が入っているか確認
// print $_GET['SORT_FLG'];
$my_sort_flg = '';
if ( isset( $_GET['SORT_FLG'] ) ){
$my_sort_flg = $_GET['SORT_FLG']; // sortがsorgやsoftになっていないか注意
} else {
$my_sort_flg = 'NO';
}
// 動画にoverlayした「別窓再生」ボタンによるmp3再生_$mp3name2
if(isset($_GET['CALLED_MP3'])){
$myCALLED_MP3 = $_GET['CALLED_MP3'];
} else {
// print $_GET['CALLED_MP3'];
// $myRECENT = "myRECENT_NOSET";
$myCALLED_MP3 = 'CALLEDMP3_IS_NONE';
}
$arr=array();
$dir = '.';
dsearch($dir);
function dsearch($dir)
{
global $arr;
$sepa = DIRECTORY_SEPARATOR;
if (!is_dir($dir)) return false;
if (!$dp= opendir($dir)) {
die("開けません");
}
while *1 !== false) { // falseが返らない間ループ
if ($file === '.' || $file === '..') continue; // スキップ
// $file{0} == '.' とすれば、ドットで始まる隠しファイルも読み飛ばせる
// http://php.net/manual/ja/function.is-dir.php
if ($file{0} == '.') continue;
if (is_dir("$dir$sepa$file")) {
continue;
//dsearch("$dir$sepa$file");
} else {
// mp4じゃなければスキップ
$info = new SplFileInfo("$file");
$ext = pathinfo($info->getFilename(), PATHINFO_EXTENSION);
//if ($ext !== 'mp4' && $ext !== 'ts') {
//if ($ext !== 'mp4') continue;
if ($ext !== 'mp4' &&
$ext !== 'MP4' &&
$ext !== 'mov' &&
$ext !== 'MOV' &&
$ext !== 'ts' &&
$ext !== 'TS' &&
$ext !== 'avi' &&
$ext !== 'AVI' &&
$ext !== 'webm' &&
$ext !== 'WEBM' &&
$ext !== 'mkv' &&
$ext !== 'MKV'
) continue;
}
//echo "$dir$sepa$file<br />\n";
$arr = "$dir$sepa$file";
}
// 配列を降順にする
$arr = array_reverse($arr);
closedir($dp);
//var_dump($arr);
}
// ページング実装
// https://web-dev.xyz/php-get-paging/
//print '<div style="z-index: 2000; position: fixed; bottom: 10px; right: 100px; background-color:white; opacity:0.9; width:auto;">';
//print '<div style="z-index: 2001; position: fixed; bottom: 1%; right: 1px; background-color:white; opacity:0.9; text-align:left" class="box_scrollbar_Page">';
$totalPage = count($arr);
// print 'Total:' . $totalPage;
// print '<br>';
$maxPage = 5;
if (isset($_GET["page"]) &&
$_GET["page"] > 0 &&
// $_GET["page"] <= $totalPage) {
$_GET["page"] <= $maxPage) {
$nowPage = (int)$_GET["page"];
} else {
$nowPage = 1;
}
// print '<font color="red">現在ページ:' . "$nowPage" . '</font>';
// print '<br>';
// 300オーバーなら3ページに分ける
// 300オーバーなら5ページに分ける
if ($totalPage > 300) {
// $maxPerPage = round($totalPage / 3);
$maxPerPage = round($totalPage / 5);
$flgPageDevide='YES';
} else {
$maxPerPage = $totalPage;
$flgPageDevide='NO';
}
// 最後のページ
$maxLastPage = $totalPage - ($maxPerPage * 4);
// 前後ページ
$prevPage = $nowPage-1;
$nextPage = $nowPage+1;
if ($flgPageDevide === 'YES') {
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<!-- <link rel="stylesheet" href="css/bootstrap.min.css"> -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<style>
/* スクロールバーPage */
.box_scrollbar_Page {
overflow:auto;
width:auto;
height:auto; /*ここでメニューの高さを調整する*/
padding:0.5px;
/* border:1px solid #000; */
background-color:#F9F9F9;
color:#000;
font-size:15px;
}
/* スクロールバー */
.box_scrollbar3 {
overflow:auto;
width:310px;
height:auto; /*ここでメニューの高さを調整する*/
padding:0.5px;
/* border:1px solid #000; */
background-color:#F9F9F9;
color:#000;
font-size:15px;
}
</style>
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<link rel="stylesheet" type="text/css" href="./inputDesign.css">
<!-- <title>galmov03 bootstrap</title> -->
<title><?php $_SERVER['PHP_SELF']; ?></title>
</head>
<!-- Navbar ナビゲーションバーを上部に固定する body style -->
<body style="padding-top:120px">
<!-- bootstrap p161 -->
<!--
<nav class="navbar navbar-dark bg-dark">
画面の幅が一定以上で動き変える-lg
<nav class="navbar navbar-expand-lg navbar-dark bg-dark" role="navigation">
Navbarを上部に固定するには<bodyにpaddingしたあとに fixed-top を入れる
-->
<nav class="navbar fixed-top navbar-expand-lg navbar-dark bg-dark" role="navigation">
<!-- <div class="container"> -->
<!-- <a href="#" class="navbar-brand">Navbar p<?php // print "$nowPage"?> -->
<a href="#" class="navbar-brand">Movs
<!-- <span class="badge badge-light"><?php // print "$totalPage" ?></span></a> -->
<!-- <span class="badge badge-info"> -->
<?php
/// Navbarに現在表示中のページのfrom toを表示する
// php でseq()するにはrange()を使う
if ("$nowPage" === "1" ) {
// print '1 - ' . "$maxPerPage";
$pSTART = "1";
$pLAST = "$maxPerPage";
// print '<span class="badge badge-light">1</span>' . ' - ' . '<span class="badge badge-light">' . "$maxPerPage" . '</span>';
} else if ("$nowPage" === "5") {
// print "$maxPerPage"*("$nowPage"-1)-1 . ' - ' . "$totalPage";
// print '<span class="badge badge-light">' . "$maxPerPage"*("$nowPage"-1)-1 . '</span>' . ' - ' . '<span class="badge badge-light">' . "$totalPage" . '</span>';
// print '<span class="badge badge-light">' . "$pSTART" . '</span>' . ' - ' . '<span class="badge badge-light">' . "$totalPage" . '</span>';
// print '<span class="badge badge-light">' . "$pSTART" . '</span>' . ' - ' . '<span class="badge badge-light">' . "$pLAST" . '</span>';
$pSTART = "$maxPerPage"*("$nowPage"-1)-1;
$pLAST = "$totalPage";
} else {
// if ("$nowPage" === "2" ) {
// print '<span class="badge badge-light">' . "$maxPerPage"*("$nowPage"-1)+1 . '</span>' . ' - ' . '<span class="badge badge-light">' . "$maxPerPage"*("$nowPage"-1)+1 . '</span>';
// print "$maxPerPage"*("$nowPage"-1)+1 . ' - ' . "$maxPerPage"*"$nowPage";
$pSTART = "$maxPerPage"*("$nowPage"-1)+1;
$pLAST = "$maxPerPage"*"$nowPage";
}
// Navbarに現在表示中のページを「badge」で表示
print '<span class="badge badge-light">' . "$pSTART" . '</span>' . ' - ' . '<span class="badge badge-light">' . "$pLAST" . '</span>';
?>
<!-- </span></a> -->
</a>
<button class="navbar-toggler" type="button"
data-toggle="collapse"
data-target="#navmenu1"
aria-controls="navmenu1"
aria-expanded="false"
aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navmenu1">
<div style="text-align: right"><!-- @@ -->
<!-- <div class="navbar-nav"> -->
<ul class="navbar-nav mr-auto">
<?php
$my_badge = '<span class="badge badge-info">';
// php でseq()するにはrange()を使う
foreach(range(1,5) as $pg) {
// 表示するページに含まれる動画総数を計算
if ("$pg" == 5) {
$having_mov = "$totalPage" - "$maxPerPage"*4;
} else {
$having_mov = "$maxPerPage";
}
// 今いるページのbadgeにcolorを付ける
if ("$pg" === "$nowPage" ) {
print '<a class="nav-item nav-link" href="?page=' . "$pg" . '&SORT_FLG=YES">p' . "$pg" . '<span class="badge badge-warning">' . "$having_mov" . ' movs</a>';
} else {
print '<a class="nav-item nav-link" href="?page=' . "$pg" . '&SORT_FLG=YES">p' . "$pg" . '<span class="badge badge-light">' . "$having_mov" . ' movs</a>';
}
}
?>
<!--
<a class="nav-item nav-link" href="?page=1&SORT_FLG=YES">p1 <span class="badge badge-light"><?php // print "$maxPerPage" ?></span></a>
<a class="nav-item nav-link" href="?page=2&SORT_FLG=YES">p2 <span class="badge badge-light"><?php // print "$maxPerPage" ?></a>
<a class="nav-item nav-link" href="?page=3&SORT_FLG=YES">p3 <span class="badge badge-light"><?php // print "$maxPerPage" ?></a>
<a class="nav-item nav-link" href="?page=4&SORT_FLG=YES">p4 <span class="badge badge-light"><?php // print "$maxPerPage" ?></a>
<a class="nav-item nav-link" href="?page=5&SORT_FLG=YES">p5 <span class="badge badge-light"><?php // print "$maxLastPage" ?></a>
-->
<a class="nav-item nav-link" href="?page=<?php print "$prevPage" ?>&SORT_FLG=YES">前ページ</a>
<a class="nav-item nav-link" href="?page=<?php print "$nextPage" ?>&SORT_FLG=YES">次ページ</a>
</ul>
<!-- sort状態 -->
<font color="gray"><?php print 'sort:' . "$my_sort_flg" ?></font>
</div>
</nav>
<!-- <h3>p159 ナビゲーションをデータ属性APIで利用するのPILL(背景色ありボタン)</h3> -->
<!-- <ul class="nav nav-tabs" id="myTabPILL" role="tablist"> -->
<ul class="nav nav-pills" id="myTabPILL" role="tablist">
<!-- <ul class="nav fixed-bottom nav-pills" id="myTabPILL" role="tablist"> -->
<!-- <li class="nav-item"><a class="nav-link active" id="douga-tabPILL" data-toggle="tab" href="#dougaPILL" role="tab" aria-controls="douga" aria-selected="true">動画</a></li> -->
<li class="nav-item"><a class="nav-link active" id="douga-tabPILL" data-toggle="pill" href="#dougaPILL" role="tab" aria-controls="douga" aria-selected="true">動画</a></li>
<!-- nav-linkのあとのactiveを複数書いちゃうとうまく動かない注意<p> -->
<li class="nav-item"><a class="nav-link " id="ytdl-tabPILL" data-toggle="pill" href="#ytdlPILL" role="tab" aria-controls="ytdl" aria-selected="false">Tube</a></li>
<li class="nav-item"><a class="nav-link " id="gazdl-tabPILL" data-toggle="pill" href="#gazdlPILL" role="tab" aria-controls="gazdl" aria-selected="false">GAZ</a></li>
<li class="nav-item"><a class="nav-link " id="upld-tabPILL" data-toggle="pill" href="#upldPILL" role="tab" aria-controls="upld" aria-selected="false">UP</a></li>
<li class="nav-item"><a class="nav-link " id="linkZ-tabPILL" data-toggle="pill" href="#linkZPILL" role="tab" aria-controls="linkZ" aria-selected="false">リンク</a></li>
</ul>
<!-- パネル部分 -->
<div class="tab-content mt-3" id="myTabContentPILL">
<!-- PILLスタート -->
<div class="tab-pane fade show active" id="dougaPILL" role="tabpanel" aria-labelleby="douga-tabPILL">
<!-- dougaPILLのコンテンツが入ります<br> -->
<!--
<p><mark>data-toggle="tab"</mark>が<mark>データ属性</mark>
<p>nav-linkのあとのactiveを複数書いちゃうとうまく動かない注意<p>
<p>nav-pillsのあとの<mark>id</mark>を他と<mark>かぶらないように</mark><p>
<p>要素に属性data-toggle="tab"またはdata-toggle="pill"を追加するだけで、JavaScriptを記述する>ことなくタブ切り替えまはたPILL切り替えのナビゲーションを有効にできます。パネルぶぶんは全体をdiv要素で囲ん
で、tab-contentクラスを追加します。各パネルとなる要素には、tab-paneクラスを追加し、<mark>最初に表示するパ
ネルには</mark>activeおよびshowクラスを追加します。パネルをフェードインさせるには、fadeクラスを追加します
。
-->
<!-- dougaPILLの中に foreachのリストが入るのでここで /divで閉じない -->
<!-- </div> -->
<style>
th { color: red;}
</style>
<script></script>
<?php
// 更新日sort実装 20191231
// https://pisuke-code.com/php-way-to-sort-files-by-lastmod/
if( $my_sort_flg === 'YES') {
$sort_by_lastmod = function($a, $b) {
return filemtime($b) - filemtime($a);
}; //この末尾のカンマ忘れるな
usort( $arr, $sort_by_lastmod );
}
print '<div class="card-columns">';
//var_dump($arr);
//動画数カウンタ $cnt_mov
$cnt_mov = 0;
foreach ($arr as $i) {
echo " ";
$info2 = new SplFileInfo("$i");
$ext2 = pathinfo($info2->getFilename(), PATHINFO_EXTENSION);
// 動画ファイルのみにする
if ($ext2 !== 'mp4' &&
$ext2 !== 'MP4' &&
$ext2 !== 'mov' &&
$ext2 !== 'MOV' &&
$ext2 !== 'ts' &&
$ext2 !== 'TS' &&
$ext2 !== 'avi' &&
$ext2 !== 'AVI' &&
$ext2 !== 'webm' &&
$ext2 !== 'WEBM' &&
) continue;
// Paging実装
$cnt_mov++;
// print $maxPerPage;
// print $cnt_mov;
// 5ページ目指定なのに、$cnt_movが4ページ目より前の若さならスルー(continue)
if (
$nowPage == 5 && $cnt_mov <= $maxPerPage*4 ||
// 4ページ目指定なのに、$cnt_movが4ページ目より後の年寄りならスルー(continue)
$nowPage == 4 && $cnt_mov > $maxPerPage*4 ||
// 4ページ目指定なのに、$cnt_movが3ページ目より前の若さならスルー(continue)
$nowPage == 4 && $cnt_mov <= $maxPerPage*3 ||
// 3ページ目指定なのに、$cnt_movが3ページ目より後の年寄りならスルー(continue)
$nowPage == 3 && $cnt_mov > $maxPerPage*3 ||
// 3ページ目指定なのに、$cnt_movが2ページ目より前の若さならスルー(continue)
$nowPage == 3 && $cnt_mov <= $maxPerPage*2 ||
// 2ページ目指定なのに、$cnt_movが3ページ目より後の年寄りならスルー(continue)
$nowPage == 2 && $cnt_mov > $maxPerPage*2 ||
// 2ページ目指定なのに、$cnt_movが1ページ目より前の若さならスルー(continue)
$nowPage == 2 && $cnt_mov <= $maxPerPage ||
// 1ページ目指定なのに、$cnt_movが2ページ目より後の年寄りならスルー(continue)
$nowPage == 1 && $cnt_mov > $maxPerPage
) {
// print ' スルーします<br>';
continue;
} // else {
// print ' スルーしません<br>';
// }
//echo "<a href=\"$i\"><img src=\"./thumb_movie_images/$i" . "_01.jpg\" alt=\"$i\" width=\"200\" height=\"auto\">$i</a><br>";
// echo "<a href=\"$i\"><img src=\"./thumb_movie_images/$i" . "_01.jpg\" alt=\"$i\" width=\"200\" height=\"auto\"></a>";
//echo "<a href=\"$i\">$i</a><br>";
//echo "<br>";
// bootstrapでカードにしてみる
// print '<div class="card mb-2 bg-dark text-white text-right" style="max-width: 25rem;">';
print '<div class="card bg-dark text-white text-left text-buttom" style="max-width: 30rem;">';
// print '<img class="card-img-top" src="./thumb_movie_images/' . "$i" . '_01.jpg" alt="' . "$i" . '">';
// print '<a href="' . "$i" .'"><img class="card-img-top" src="./thumb_movie_images/' . "$i" . '_01.jpg" alt="' . "$i" . '"></a>';
// ファイル名にシャープが含まれているとリンクできないのrawurlencode()で対応しようとしたが
// そもそも<form>で自分自身にGETないしPOSTするのでなければ(グローバル変数にファイル名が
// 渡らずに完結するのであれば)つまり<href>でリンクするだけならurlencode()は不要。
// <form>にしてGET_で受けるような、いったんこのphpからファイル名が外に出る場合にはrawurlencode()が必要になる。
print '<a href="' . "$i" .'">';
// print '<img class="card-img-top" src="./thumb_movie_images/' . "$i" . '_01.jpg" alt="' . "$i" . '">';
print '<img class="card-img-top" src="./thumb_movie_images/' . "$i" . '_01.jpg" alt="">';
print '</a>';
// print '<img class="card-img" src="gakki.png"';
// print '<h4 class="card-title">' . "$i" . '</h4>';
//print '<div class="card-body>';
print '<div class="card-img-overlay">';
// print '<p class="card-text">' . basename("$i") . '</p>';
// print '<a href="' . "$i" . '<h6 class="card-text">' . basename("$i") . '</h6>';
// print '<h6 class="card-text">' . basename("$i") . '</h6>';
// $cnt_mov++;
// print '<h4 class="card-title">' . basename("$i") . '</h4>';
if("$ext2" == 'mp4' or "$ext2" == 'MP4') {
// print '<a href="' . "$i" . '" class="btn btn-primary">再生</a>';
// print '<a href="' . "$i" . '" class="btn btn-primary">再生 <span class="badge badge-light">' . '9' . '</span></a>';
// print '<a href="' . "$i" . '" class="btn btn-primary">再生 <span class="badge badge-light">' . "$cnt_mov" . '</span></a>';
// print '<a href="' . "$i" . '" class="btn btn-primary">再生</a><span class="badge badge-light">' . "$cnt_mov" . '</span>';
// print '<a href="' . "$i" . '" class="btn btn-primary">再生</a><br><span class="badge badge-light">' . "$cnt_mov" . '</span>';
// print '<span class="badge badge-light">' . "$cnt_mov" . '</span><a href="' . "$i" . '" class="btn btn-primary">再生</a><br>';
//print '<span class="badge badge-light text-left">' . "$cnt_mov" . '</span><a href="' . "$i" . '" class="btn btn-primary text-right">再生</a><br>';
// print '<a href="' . "$i" . '" class="btn btn-primary"><span class="badge badge-light">' . "$cnt_mov" . '</span> 再生</a>';
print '<a href="' . "$i" . '" class="btn btn-primary" target="_blank"><span class="badge badge-light">' . "$cnt_mov" . '</span> 再生</a>';
} else if("$ext2" == 'mkv' or "$ext2" == 'MKV') {
// print '<a href="' . "$i" . '" class="btn btn-secondary">変換</a>';
print '<a href="' . "$i" . '" class="btn btn-secondary"><span class="badge badge-light">' . "$cnt_mov" . '</span>変換</a>';
} else {
print '<a href="' . "$i" . '" class="btn btn-secondary"><span class="badge badge-light">' . "$cnt_mov" . '</span></a>';
}
// print '<h6 class="card-text text-dark">' . "$timestamp" . '</h6>';
// 音声再生ボタン実装 20190105
$mp3name = "$i" . '.mp3';
if (file_exists("$mp3name")){
// print rawurlencode(basename("$mp3name"));
print '<br>';
// print '<a href="' . rawurlencode(basename("$mp3name")) . '" class="btn btn-warning" target="_blank">音声再生</a>';
// print '<a href="' . "$mp3name" . '" class="btn btn-warning" target="_blank">音声再生</a>';
// HTML5 別窓で音楽再生の実装
print '<form action="galmov03b.php" method="GET">';
print '<input type="hidden" name="CALLED_MP3" value="' . $mp3name . '">';
// print '<input type="hidden" name="CHDIR" value="' . $myCHDIR . '">';
// print '<input type="hidden" name="GREPWORD" value="' . $myGRE . '">';
// print '<input type="hidden" name="MKTYPE" value="goMKMP3" id="ID_MKMP3"/></a>';
print '<input type="hidden" name="SORT_FLG" value="YES" id="ID_MYSORT_FLG"/></a>';
print '<input type="hidden" name="page" value="' . "$nowPage" . '" id="ID_MKpage"/></a>';
print '<input type="submit" value="別窓再生" class="btn btn-warning"/></a>';
print '<br>';
print '</form>';
// print '<a href="./doLSglob.php?CALLED_MP3=' . rawurlencode("$i") . '.mp3&MKSORT=goMKSORT" class="btn btn-warning" target="_blank">別窓再生</a>';
// 再生中のmp3だけ別窓にする 20200208
//if ($myCALLED_MP3 !== 'CALLEDMP3_IS_NONE') {
if(isset($_GET['CALLED_MP3']) && $myCALLED_MP3 == "$mp3name"){
/// opacityの横幅サイズはwidthでも書けるけどscrollbarのときはstyle..cssのとこで規定してる
/// opacityの透明度0.5で薄くなる 背景blackにしたらmarqueeの行にある text-warning(黄色文>字)とセットにすること
print '<div style="z-index: 2002; position: fixed; bottom:1px; right: 0px; background-color:black; opacity:0.5; text-align:left" class="box_scrollbar3">';
//print '<div style="z-index: 2003; position: fixed; bottom: 1%; right: 1px; background-color:white; opacity:0.9; text-align:right width:10%">';
print "$my_badge" . "$cnt_mov" . '</span>';
print '<br>';
// print "$i";
// print '<a class="text-light" href="' . "$i" . '"> ' . "$i" . '</a>';
print '<marquee scrolldelay="200"><p class="text-warning">' . "$i" . '</p></marquee>';
print '<br>';
// print '<audio src="' . rawurlencode("$i") . '" autoplay loop controls preload="none"><p>このブラウザは音声再生に対応していません</p>
// print '<audio src="' . "$i" . '" autoplay loop controls preload="none"><p>このブラウザ
は音声再生に対応していません</p>
// ファイル名の頭の ./ を取り去る
$mp3nameTEMP = explode("/" , "$mp3name");
print '<audio src="' . "$mp3nameTEMP[1]" . '" autoplay loop controls preload="none"><p>こ
のブラウザは音声再生に対応していません</p></audio>';
print '<br>';
// print '<video id="Video1" width="300" height="auto" src="' . "$myDOM" . "$i" . '" controls ><a href="' . "$i" . '">' . "$i" . '</a></p></video>';
print '<video id="Video1" width="300" height="auto" src="' . "$i" . '" controls ><a href="' . "$i" . '">' . "$i" . '</a></p></video>';
print '</div>';
}
}
///// bedgeの次にファイル名を表示するには「overlay終わり」直前に持ってくる
// 更新日時を表示 20191231
$timestamp = date('Y-m-d H:i:s', filemtime($i));
// print '<h6 class="card-text">' . basename("$i") . '<br>' . "$timestamp" . '</h6>';
print '<h6 class="card-text">' . basename("$i") . '</h6>';
print '<h6 class="card-text text-dark">' . "$timestamp" . '</h6>';
// card-img-overlay終わり
print '</div>';
print '</div>';
}
print '</div>';
?>
<!-- ↓ dougaPILLこのdivまで -->
</div>
<!-- ###### ##### ##### -->
<div class="tab-pane fade" id="gazdlPILL" role="tabpanel" aria-labelleby="gazdl-tabPILL">
<!-- GAZPILLのコンテンツが入ります -->
<form action="./doGAZODL.php" method="GET">
<span style="color:orange;">画像検索する単語</span>
<br>
<!--
<textarea name="INTXT" value="" rows="3" style="font-size:20px;" id="inputurl" size="auto"></textarea>
-->
<textarea name="INTXT" value="" class="form-control input-sm" rows="2" style="font-size:20px" id="inputurl"></textarea>
<label for="inputurl"></label>
<br>
<input type="radio" name="SAVEDIR" value="save_to_PT3" style="border-color:orange" id="svgazdirPT3" />
<label for="svgazdirPT3" class="radio">PT3</label>
<input type="radio" name="SAVEDIR" value="save_to_PT5" style="border-color:orange" id="svgazdirPT5" />
<!--
<label for="svgazdirPT5" class="radio">PT5へ保存</label>
-->
<input type="radio" name="SAVEDIR" value="save_to_H2" style="border-color:orange" id="svgazdirH2" checked/>
<label for="svgazdirH2" class="radio">H2</label>
<br>
<!--
<input type="radio" name="SAVENUM" value="11" style="border-color:orange" id="svnum11" />
<label for="svnum11" class="radio">11枚</label>
<input type="radio" name="SAVENUM" value="200" style="border-color:orange" id="svnum200" />
<label for="svnum200" class="radio">200枚</label>
<input type="radio" name="SAVENUM" value="300" style="border-color:orange" id="svnum300" />
<label for="svnum300" class="radio">300枚</label>
-->
<input type="radio" name="SAVENUM" value="100" style="border-color:orange" id="svnum100" />
<label for="svnum100" class="radio">100枚</label>
<input type="radio" name="SAVENUM" value="400" style="border-color:orange" id="svnum400" checked/>
<label for="svnum400" class="radio">400枚</label>
</fieldset>
<!--
<label class="radio"><input type="submit" value="録画開始" style="width:100px; height:50px;"></label>
<input type="submit" value="録画開始" style="width:100px; height:50px;">
-->
<br>
<input type="submit" value="検索+保存" class="sbt_1">
<br>
</form>
</div>
<!-- ###### ##### ##### -->
<div class="tab-pane fade" id="upldPILL" role="tabpanel" aria-labelleby="upld-tabPILL">
<!-- uploadPILLのコンテンツが入ります -->
<form action="./02_upload_multi.php" method="post" enctype="multipart/form-data">
<!--
<input type="file" name="upfile" multiple style="width:300px; height:50px;">
<input type="submit" value="送信" style="width:100px; height:50px;" class="sbt_2">
-->
<input type="file" name="upfile" multiple>
<hr>
<input type="submit" value="送信" class="sbt_1">
</form>
</div>
<!-- ###### ##### ##### -->
<div class="tab-pane fade" id="ytdlPILL" role="tabpanel" aria-labelleby="ytdl-tabPILL">
<!-- ytdlPILLのコンテンツが入ります -->
<span style="color:orange;">ダウンロードURL</span>
<form action="./doTUBEDL.php" method="GET">
<div class="form-group">
<!-- <textarea name="INTXT" value="" rows="8" cols="30" style="font-size:40px;" id="inputurl" size="auto"></textarea> -->
<textarea name="INTXT" value="" class="form-control input-sm" rows="2" style="font-size:20px" id="inputurl"></textarea>
<label for="inputurl"></label>
<br>
<input type="radio" name="SAVEDIR" value="save_to_YY style="border-color:orange" id="svdldirYY" />
<label for="svdldirYY" class="radio">良</label>
<input type="radio" name="SAVEDIR" value="save_to_H2" style="border-color:orange" id="svdldirH2" checked/>
<label for="svdldirH2" class="radio">H2</label>
<input type="radio" name="SAVEDIR" value="save_to_PT3" style="border-color:orange" id="svdldirPT3"/>
<label for="svdldirPT3" class="radio">PT3</label>
<br>
<input type="submit" value="保存" class="sbt_1">
</div>
</form>
</div>
<!-- ###### ##### ##### -->
<div class="tab-pane fade" id="linkZPILL" role="tabpanel" aria-labelleby="linkZ-tabPILL">
リンクPILLのコンテンツが入ります
<div style="text-align: right">
<div style="z-index: 1500 position: fixed bottom: 1% right:5% background-color:white opacity:0.9 width:300px">
<div style="z-index: 1500 position: fixed bottom: 1% right:1% background-color:white opacity:0.9 width:auto">
<font size="3px"><a href="./galpdf01b.php"><img src="./icon_PDF.svg" width="auto" height="80px"></a></font>
<font size="3px"><a href="./doMKPDF.html"><img src="./icon_PDF.png" width="auto" height="80px"></a></font>
<font size="3px"><a href="./galmov03b.php?SORT_FLG=YES"><img src="./icon_MP4D.svg" width="50px" height="80px"></a></font>
<font size="3px"><a href="./doLSglob.php?CHDIR=PT3&GREPWORD=pdf"><img src="./icon_LS.png" width="80px" height="auto"></a></font>
<font size="3px"><a href="./doLSglob.php?CHDIR=PT3&GREPWORD=mp4&MKSORT=goMKSORT"><img src="./icon_MP4b.svg" width="80px" height="auto"></a></font>
<!--
<font size="3px"><a href="' . "$my_dom" . 'PT3/galpdf01b.php"><img src="./icon_PDF.svg" width="160px" height="auto"></a></font><br><br>'
<font size="3px"><a href="./galmov03b.php?SORT_FLG=YES"><img src="./icon_MP4D.svg" width="50px" height="auto"><br>sort:' . "$my_sort_flg" . '</a></font>'
<font size="3px"><a href="#"><img src="./icon_MP4.svg" width="160px" height="auto"></a></font>
<font size="3px"><a href="./galmov03b.php?SORT_FLG=YES"><img src="./icon_MP4D.svg" width="50px" height="auto"></a></font>
-->
<br>
</div>
</div>
<!-- 複数フォームを実行するためのjQuery -->
<script type="text/javascript" src="./jquery-3.4.1.min.js"></script>
<script type="text/javascript">
// 単一フォーム に 複数サブミット を配置して 遷移先 を切り替える 方法
// submitボタン複数をjQueryで切り替える
// https://garafu.blogspot.com/2017/04/one-form-multiple-submit.html
// javascriptのfunction
(function() {
/// 関数
// 「検索」ボタン押下時に呼び出される
var btnKensaku_onclick = function(event) {
// $("#form").attr("action", "./doLSglob.php").submit();
$("#form").attr("action", "./galmov03b.php?SORT_FLG=YES").submit();
};
/// 関数
// 「grep実行」ボタン押下時に呼び出される
var btnGrep_onclick = function(event) {
// $("#form").attr("action", "./doLSglob.php").submit();
$("#form").attr("action", "./doLSglob.php").submit();
};
/// 関数
// 「pi実行」ボタン押下時に呼び出される
var btnPi_onclick = function(event) {
// $("#form").attr("action", "./doMOVSH.php").submit();
$("#form").attr("action", "./galmov03b.php?SORT_FLG=YES").submit();
};
///// main
///// ドキュメント読み込み完了時に呼び出される
var document_onready = function(event) {
// btn-mysearch 押されたら btnGrep_onclick()を実行
$("#btn-mysearch").on("click", btnKensaku_onclick);
// btn-grep 押されたら btnGrep_onclick()を実行
$("#btn-grep").on("click", btnGrep_onclick);
// btn-pi 押されたら btnPi_onclick()を実行
$("#btn-pi").on("click", btnPi_onclick).focus();
};
$(document).ready(document_onready);
})();
// jQuery動作確認
// window.alert('jQuery動作確認');
// window.alert($.fn.jquery);
</script>
</body>
</html>
<hr>
<!-- 検索KENSAKU bootstrap本 p167のパターン-->
<button class="btn btn-light mr-3" type="button">通常のボタン</button>
<button class="btn btn-sm btn-light" type="button">小さいボタン</button>
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">検索</button>
<hr>
<!-- p169 検索フォーム -->
<form class="form-inline">
<div class="input-group mb-3">
<!-- 検索KENSAKU bootstrap本 p229のパターン -->
<input type="text" class="form-control" placeholder="search" aria-label="search" aria-describedby="basic-addon1">
<div class="input-group-append">
<!-- <button class="btn btn-secondary" type="button">検索</button> -->
<!-- <button class="btn btn-secondary" type="button">検索</button> -->
<button class="btn btn-secondary" type="submit" id="btn-mysearch">検索</button>
</div>
</div>
</form>
*1:$file=readdir($dp