I have several websites for which I am responsible. On one site, I am building a new gallery site for storing pictures as well as sound and video clips. There are several good options for building a gallery site, and I have used more than one with success. For the site in question, I decided to use Coppermine, which is powerful, configurable, open source, and freely licensed using the GNU GPL.
I ran into a little snag that took some work to figure out. To help me remember what I did, I am blogging it here. Maybe someone else will find it useful as well.
Coppermine makes it very easy to store, embed and play lots of media files and formats. That is awesome. I found one that is not supported…the now common flv, or flash video. In fact, by default you can’t even upload a file with an flv extension. Bummer. Off to Google I ran.
I found several sites with ideas and info, but one was more useful than others. Even it required lots of reading and page turning. I decided to put all the info in one page for my easy reference, but the Coppermine Gallery forum deserves a link and the credit for this method. I’m just posting it, people there came up with it. That is an old thread, though, and things have changed since the first post. I had to read the whole thing to figure out what needed to happen to make this work, and that is the reason for this post, rather than just a bookmark in my personal web browser. Okay, here are the steps I took that got this working for me.
Note: get your site up and running, with the theme work complete before doing this. That will make your life a little easier.
1. Download and install the filetype editor MOD discussed here. The mod is included in the cpg1.4.x_plugin_pack_v3 package available on the SourceForge download page for Coppermine. I happened to upload all of the plugins to my website, and sorted them from there, ending up using only a handful. That was easier for me. You do it how you want to.
2. Run the plugin and make a new filetype using the following data; “flv - application/x-shockwave-flash - movie - Flash player”
3. Download the FLV Player from this site. Extract the archive locally and upload mediaplayer.swf and swfobject.js to your Coppermine site’s root directory.
4. I added the following code to my theme’s theme.php file, before the function theme_html_img_nav_menu().
//** added by matthew to try to get flv play to work **
function theme_html_picture()
{
global $CONFIG, $CURRENT_PIC_DATA, $CURRENT_ALBUM_DATA, $USER;
global $album, $comment_date_fmt, $template_display_media;
global $lang_display_image_php, $lang_picinfo;
$pid = $CURRENT_PIC_DATA['pid'];
$pic_title = ”;
if (!isset($USER['liv']) || !is_array($USER['liv'])) {
$USER['liv'] = array();
}
// Add 1 to hit counter
if (!USER_IS_ADMIN && !in_array($pid, $USER['liv']) && isset($_COOKIE[$CONFIG['cookie_name'] . ‘_data’])) {
add_hit($pid);
if (count($USER['liv']) > 4) array_shift($USER['liv']);
array_push($USER['liv'], $pid);
}
if($CONFIG['thumb_use']==’ht’ && $CURRENT_PIC_DATA['pheight'] > $CONFIG['picture_width'] ){ // The wierd comparision is because only picture_width is stored
$condition = true;
}elseif($CONFIG['thumb_use']==’wd’ && $CURRENT_PIC_DATA['pwidth'] > $CONFIG['picture_width']){
$condition = true;
}elseif($CONFIG['thumb_use']==’any’ && max($CURRENT_PIC_DATA['pwidth'], $CURRENT_PIC_DATA['pheight']) > $CONFIG['picture_width']){
$condition = true;
}else{
$condition = false;
}
if ($CURRENT_PIC_DATA['title'] != ”) {
$pic_title .= $CURRENT_PIC_DATA['title'] . “\n”;
}
if ($CURRENT_PIC_DATA['caption'] != ”) {
$pic_title .= $CURRENT_PIC_DATA['caption'] . “\n”;
}
if ($CURRENT_PIC_DATA['keywords'] != ”) {
$pic_title .= $lang_picinfo['Keywords'] . “: ” . $CURRENT_PIC_DATA['keywords'];
}
if (!$CURRENT_PIC_DATA['title'] && !$CURRENT_PIC_DATA['caption']) {
template_extract_block($template_display_media, ‘img_desc’);
} else {
if (!$CURRENT_PIC_DATA['title']) {
template_extract_block($template_display_media, ‘title’);
}
if (!$CURRENT_PIC_DATA['caption']) {
template_extract_block($template_display_media, ‘caption’);
}
}
$CURRENT_PIC_DATA['menu'] = html_picture_menu(); //((USER_ADMIN_MODE && $CURRENT_ALBUM_DATA['category'] == FIRST_USER_CAT + USER_ID) || ($CONFIG['users_can_edit_pics'] && $CURRENT_PIC_DATA['owner_id'] == USER_ID && USER_ID != 0) || GALLERY_ADMIN_MODE) ? html_picture_menu($pid) : ”;
if ($CONFIG['make_intermediate'] && $condition ) {
$picture_url = get_pic_url($CURRENT_PIC_DATA, ‘normal’);
} else {
$picture_url = get_pic_url($CURRENT_PIC_DATA, ‘fullsize’);
}
$image_size = compute_img_size($CURRENT_PIC_DATA['pwidth'], $CURRENT_PIC_DATA['pheight'], $CONFIG['picture_width']);
$pic_title = ”;
$mime_content = cpg_get_type($CURRENT_PIC_DATA['filename']);
if ($mime_content['content']==’movie’ || $mime_content['content']==’audio’) {
if ($CURRENT_PIC_DATA['pwidth']==0 || $CURRENT_PIC_DATA['pheight']==0) {
$CURRENT_PIC_DATA['pwidth'] = 320; // Default width
// Set default height; if file is a movie
if ($mime_content['content']==’movie’) {
$CURRENT_PIC_DATA['pheight'] = 240; // Default height
}
}
$ctrl_offset['mov']=15;
$ctrl_offset['wmv']=45;
$ctrl_offset['swf']=0;
$ctrl_offset['rm']=0;
$ctrl_offset_default=45;
$ctrl_height = (isset($ctrl_offset[$mime_content['extension']]))?($ctrl_offset[$mime_content['extension']]):$ctrl_offset_default;
$image_size['whole']=’width=”‘.$CURRENT_PIC_DATA['pwidth'].’” height=”‘.($CURRENT_PIC_DATA['pheight']+$ctrl_height).’”‘;
}
if ($mime_content['content']==’image’) {
if (isset($image_size['reduced'])) {
$winsizeX = $CURRENT_PIC_DATA['pwidth']+5; //the +’s are the mysterious FF and IE paddings
$winsizeY = $CURRENT_PIC_DATA['pheight']+3; //the +’s are the mysterious FF and IE paddings
$pic_html = “<a href=\”javascript:;\” onclick=\”MM_openBrWindow(’displayimage.php?pid=$pid&fullsize=1′,’” . uniqid(rand()) . “‘,’scrollbars=yes,toolbar=no,status=no,resizable=yes,width=$winsizeX,height=$winsizeY’)\”>”;
$pic_title = $lang_display_image_php['view_fs'] . “\n==============\n” . $pic_title;
$pic_html .= “<img src=\”" . $picture_url . “\” class=\”image\” border=\”0\” alt=\”{$lang_display_image_php['view_fs']}\” /><br />”;
$pic_html .= “</a>\n”;
} else {
$pic_html = “<img src=\”" . $picture_url . “\” {$image_size['geom']} class=\”image\” border=\”0\” alt=\”\” /><br />\n”;
}
} elseif ($mime_content['content']==’document’) {
$pic_thumb_url = get_pic_url($CURRENT_PIC_DATA,’thumb’);
$pic_html = “<a href=\”{$picture_url}\” target=\”_blank\” class=\”document_link\”><img src=\”".$pic_thumb_url.”\” border=\”0\” class=\”image\” /></a>\n<br />”;
} else {
$autostart = ($CONFIG['media_autostart']) ? (’true’):(’false’);
$players['WMP'] = array(’id’ => ‘MediaPlayer’,
‘clsid’ => ‘classid=”clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6″ ‘,
‘codebase’ => ‘codebase=”http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701″ ‘,
‘mime’ => ‘type=”application/x-mplayer2″ ‘,
);
$players['RMP'] = array(’id’ => ‘RealPlayer’,
‘clsid’ => ‘classid=”clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA” ‘,
‘codebase’ => ”,
‘mime’ => ‘type=”audio/x-pn-realaudio-plugin” ‘
);
$players['QT'] = array(’id’ => ‘QuickTime’,
‘clsid’ => ‘classid=”clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B” ‘,
‘codebase’ => ‘codebase=”http://www.apple.com/qtactivex/qtplugin.cab” ‘,
‘mime’ => ‘type=”video/x-quicktime” ‘
);
$players['SWF'] = array(’id’ => ‘SWFlash’,
‘clsid’ => ‘ classid=”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″ ‘,
‘codebase’ => ‘codebase=”http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0″ ‘,
‘mime’ => ‘type=”application/x-shockwave-flash” ‘
);
$players['UNK'] = array(’id’ => ‘DefaultPlayer’,
‘clsid’ => ”,
‘codebase’ => ”,
‘mime’ => ”
);
if (isset($_COOKIE[$CONFIG['cookie_name'].’_’.$mime_content['extension'].’player’])) {
$user_player = $_COOKIE[$CONFIG['cookie_name'].’_’.$mime_content['extension'].’player’];
} else {
$user_player = $mime_content['player'];
}
// There isn’t a player selected or user wants client-side control
if (!$user_player) {
$user_player = ‘UNK’;
}
if ($mime_content['content']==’movie’ && $mime_content['mime']==’application/x-shockwave-flash’) {
if ($CURRENT_PIC_DATA['pwidth']==0 || $CURRENT_PIC_DATA['pheight']==0) {
$CURRENT_PIC_DATA['pwidth'] = 640; // Default width
$CURRENT_PIC_DATA['pheight'] = 480; // Default height
}
$CURRENT_PIC_DATA['pwidth']-=26; // black bars on sides for me for some reason
$flv = $CONFIG['fullpath'] . $CURRENT_PIC_DATA['filepath'] . $CURRENT_PIC_DATA['filename'];
if($mime_content['extension']!=’flv’) {
$flvcheck = fopen($flv,”r”);
$flv=fgets($flvcheck);
fclose($flvcheck);
}
$exxvars=str_replace($CONFIG['thumb_pfx'], $CONFIG['normal_pfx'], get_pic_url($CURRENT_PIC_DATA,’thumb’));
if(!file_exists($exxvars)) $exxvars=get_pic_url($CURRENT_PIC_DATA,’thumb’);
$exxvars=”ℑ=”.$exxvars;
$pic_html = “<embed src=\”mediaplayer.swf\” width=’”.$CURRENT_PIC_DATA['pwidth'].”‘ height=’”.$CURRENT_PIC_DATA['pheight'].”‘ allowfullscreen=\”true\” allowscriptaccess=\”always\” type=\”application/x-shockwave-flash\” pluginspage=\”http://www.macromedia.com/go/getflashplayer\”
flashvars=\”file=$flv$exxvars\”></embed>”;
} else {
$player = $players[$user_player];
$pic_html = ‘<object id=”‘.$player['id'].’” ‘.$player['classid'].$player['codebase'].$player['mime'].$image_size['whole'].’>’;
$pic_html .= “<param name=\”autostart\” value=\”$autostart\” /><param name=\”src\” value=\”". $picture_url . “\” />”;
$pic_html .= ‘<embed ‘.$image_size['whole'].’ src=”‘. $picture_url . ‘” autostart=”‘.$autostart.’” ‘.$player['mime'].’></embed>’;
$pic_html .= “</object><br />\n”;
}
}
$CURRENT_PIC_DATA['html'] = $pic_html;
$CURRENT_PIC_DATA['header'] = ”;
$CURRENT_PIC_DATA['footer'] = ”;
$CURRENT_PIC_DATA = CPGPluginAPI::filter(’file_data’,$CURRENT_PIC_DATA);
$params = array(’{CELL_HEIGHT}’ => ‘100′,
‘{IMAGE}’ => $CURRENT_PIC_DATA['header'].$CURRENT_PIC_DATA['html'].$CURRENT_PIC_DATA['footer'],
‘{ADMIN_MENU}’ => $CURRENT_PIC_DATA['menu'],
‘{TITLE}’ => bb_decode($CURRENT_PIC_DATA['title']),
‘{CAPTION}’ => bb_decode($CURRENT_PIC_DATA['caption']),
);
return template_eval($template_display_media, $params);
}
//** end added by matthew **
I have not tried them, but I have read that there are some changes you can make to your theme’s template.html file that will allow you to change the size of the video on site. If I am successful doing so, I will add that info in a comment here. Otherwise, this is all I have done, and the site in question now allows me to upload flash video and play it in the same way as an mpg or mov.
April 26th, 2008
One of the most freeing moments of my life was when I learned to stay out of other people’s business. That moment freed me from the stress and worry of trying to keep everyone else safe, correct, or “on the right path.” Don’t get me wrong, there is a place and a time for that. The real trick is learning how to discern what is your responsibility and what is not, in other words, when are where are those proper times and places?
I like to use the analogy of circles. Each of us is given a circle of responsibility and influence. Everything in the circle is ours. Everything outside of that circle is not ours. The things inside of other people’s circles are their responsibility.
Sometimes responsibilities are shared, like my wife and I each have our children within the shared, overlapping portions of our individual circles.
Sometimes my circles contain other people’s circles. My children, especially as they are very young, are fully within my circle. As they get older, my job as a father is to help them learn how to manage the things in their circle well, giving them authority and power over their lives. At first, I control the decisions. Then, I allow them to make decisions within parameters I establish. Finally, we move to more and more freedom, ultimately allowing them to make decisions for themselves as they learn how to do so.
Sometimes circles exist only for specific areas of life. An employer’s circle of responsibility at work completely encompasses the circles of his employees, but only where work is concerned. The employer does, or should not have, any such authority over the employee at home.
Sometimes circles are unique. This blog is in my circle and no one else is responsible for it in any way (other than my web host keeping its uptime promise).
Problems appear when people overstep proper boundaries and begin trying to manage the things in other people’s circles. You are still within your circle when you state a preference or a belief. You are probably still within your circle when you advocate or promote an idea (depending on how you do it, obtrusively or respectfully). You are no longer within the boundaries of your circle when you demand that someone do things the way you want them done.
It goes the other way, too. I am fully within my circle when I delete spam comments from my blog, when I prevent them altogether, when I decide who may or may not post comments, and when I arbitrarily change the theme of my site. I am stepping outside of my circle when I demand that someone else do the same things on their site. I can comment, “I do this. Here is why. You might like it as well.” I may not say, “Anyone who administers their site differently is a moron,” and I certainly have no power or authority to demand that they change.
Actually, realizing that is quite freeing. Suddenly it is okay to allow people to make choices. I might comment occasionally, if I can do so politely and without stepping out of my circle and into someone else’s, but ultimately I must allow others to have control over their lives, to have the freedom to live as they would, if I am to expect the same consideration.
So, with that in mind, I won’t tell you how to raise your children, how to run your software project, how to administer your website, or what you should or shouldn’t believe. I might make a comment occasionally based on my personal preferences, but only when I can so do in a way that does not steal from you your freedom. I’ll stay out of your circle, you can rule it as you see fit. If you are working for me, I will limit my attempts to control or influence your actions only within proper the boundaries of the workplace and the job and our professional relationship. That is the path of respect.
In return, please feel free to tell me what you think, what you believe, and share ideas you have that I may not have considered. I want to hear them! Really. Then, let me make an informed decision, and let the decision be mine. Stay out of my circle.
April 24th, 2008
I spent some time this morning looking through my logs and reading some stats (when I should have been working, but that’s a different post altogether). One statistic that fascinated me was the list of search terms that have led people to this site. Some are obvious, because I have written posts on these topics.
conky
using rsync for backup
ubuntu forums
date ideas
guitar effect settings
automatic php database backup
But then there are some that both confuse and amuse me. I thought I would share them, in case you needed a chuckle. How any of these led someone to my site is a mystery, probably involving chaos math and a butterfly somewhere in Venezuela.
joke donut difference between a
the coolest things ever known to man
soda cause achy feeling
“top secret” morocco site:net
what are the coolest clothes on oblivion
can diet coke cause indigestion
what do you call a conductor’s stick?
Please, share yours. I need the laugh.
April 24th, 2008
Actually, I am fine with that. I have copyrighted all the posts on my blog, but I have also licensed all of them with a Creative Commons license (unless you see a specific notice stating otherwise). In other words, if you are one of those who is aggregating my posts and reproducing them on your site, that is okay with me, as long as you do the following things.
1. You retain my name and copyright notice on all posts, and you include a link to my main blog site on your site or in the post itself, preferably both.
2. You do not make any money from my work without talking directly to me and getting my permission (and preferably offering some sort of royalties).
3. You do not change my words or modify my information without saying you have done so and releasing your derivative work under the same license.
I know a lot of people who have been complaining about this sort of thing, and I understand their frustration. Instead of fighting this, I am choosing to embrace it. To help those who wish to use my content to comply with my wishes, I am now including an automatic copyright notice and link at the bottom of each of my rss feed entries. If you are using WordPress, you can do the same thing with the Simple Feed Copyright plugin.
April 20th, 2008