Ravens PHP Scripts: Forums
 

 

View next topic
View previous topic
Post new topic   Reply to topic    Ravens PHP Scripts And Web Hosting Forum Index -> Modules
Author Message
kenno
Worker
Worker



Joined: Jul 26, 2009
Posts: 117
Location: Scunthorpe, UK

PostPosted: Sun Jun 05, 2011 1:38 pm Reply with quote

This looks really really good, I am eagerly awaiting its release.
Thank you for taking the time to create this.

I have a vps server which I could maybe let you write the functions for FFMPEG, if you wanted to ?
 
View user's profile Send private message
killing-hours
RavenNuke(tm) Development Team



Joined: Oct 01, 2010
Posts: 438
Location: Houston, Tx

PostPosted: Tue Jun 07, 2011 7:06 am Reply with quote

I've already got an account setup on another users server to write the functions... I just have been extremely busy with normal life in the past couple of weeks as well as helping my folks with some things since they are getting of age and can't do the things they once could.

Thank you for the offer though.

_________________
Money is the measurement of time - Me
"You can all go to hell…I’m going to Texas" -Davy Crockett 
View user's profile Send private message
killing-hours







PostPosted: Thu Jul 07, 2011 8:34 pm Reply with quote

Updated the first post with an administration side teaser. Click on the image to see it.

For those following this topic... I apologize for not putting more time into this project recently...however, I've been busy with life and I'm a couple of weeks shy of going on vacation. I have not forgotten about it nor do I plan to stop working on this.

Thank you Mrytletrees for allowing me to use your server to incorporate FFMPEG into the media gallery. Another hurdle crossed. Wink

The base functionality of the gallery are just about completed. Time to start refining and smoothing out the kinks.
 
killing-hours







PostPosted: Mon Feb 06, 2012 4:57 pm Reply with quote

A quick update for those watching....


I know it's been a long time since I updated... I'm sorry. I've just been buried in daytime work and normal "todo" stuff.

HOWEVER, I'm back on this project and with a vengeance. I've completely changed the way I wanted to manage this gallery and have begun recoding the entire way this gallery works.

As a tease... can we say "Inline Editing"? Wink

Image
 
spasticdonkey
RavenNuke(tm) Development Team



Joined: Dec 02, 2006
Posts: 1693
Location: Texas, USA

PostPosted: Mon Feb 06, 2012 10:20 pm Reply with quote

real cool stuff man, and glad you are able to get back to having "fun" Smile

look forward to seeing what you come up with
 
View user's profile Send private message Visit poster's website
killing-hours







PostPosted: Tue Feb 07, 2012 9:11 am Reply with quote

And like a bad dream that just won't end... I come into work this morning and lo and behold I'm being asked to overtake the role of web admin for another business. (Joomla or Word Press back end) Sad Good in one sense... bad in others.

Spastic... I really do think y'all will like this when it's complete. I'd really like your opinion on things once I have an Alpha version together.

The two "major" issues and most time consuming problems with creating a gallery are (A) how to get the media to the server & (B) how to manage the media once it's on the server.

While I was looking at iGallery J. Stern created with the "node" setup... I noticed that the queries where quite cumbersome and they were going to be extremely hard to keep sorted out... hence I went a different route using a recursive function I found on the net with some modifications.

Also, Jonathon hadn't attempted (at this point) to write functions for managing the media once it was on the server and I believe it was due to the complexity of the node system. (I could be wrong and only he could say for sure)

My first run at this had the "albums" in a straight line structure beneath the albums folder.

Example:

/galleries/albums/Testing
/galleries/albums/sub album of testing
/galleries/albums/sub album of testing

I didn't like this because I ask my wife to organize our photos into folders and sub folders on her pc so that we can find what we are looking for easier. So I asked myself "Why are you not taking this same approach to the management on the server?" I had no good answer for myself.

Example:

/galleries/albums/Testing
/galleries/albums/Testing/sub album of testing
/galleries/albums/Testing/sub album of testing

This presents some challenges though when editing information and what the server needs to do with a single edit. The application needs to move/rename/chmod/un chmod and move stuff around on the server to ensure the file structure on the server mirrors the structure in the database. Lots of error checking and "if/then" statements.

Then I began to really think about some things in light of how "traditional" web pages more or less keep the end users attention drawn within the confines of the page itself.

Example: (fixed width page page. [ ] = edge of browser window)
Code:
-----------------------------------------------------------

[          |               Webpage                     |          ]
[          |                                                 |          ]
[          |                                                 |          ]
[          |                                                 |          ]
[          |                                                 |          ]
[          |                                                 |          ]
[          |                                                 |          ]
[          |                                                 |          ]
[          |                                                 |          ]
-----------------------------------------------------------


The "actions" generally happen within the 2d space of the page. To me though... I see the browser as an infinitely deep window that, with the power of ajax and jquery, I can manipulate the behavior of the browser to appear as if it's a more "minority report" type application where the user has to take their mind out of the 2d space and bring them into a more 3d type fluid interface.

This obviously raises the level of things I have to take into account and code... but it "should" result in a more immersive experience for the end user as the "instant gratification" gland is massaged and the browser then becomes a gateway to a 3d interactive interface.

Listen to me ramble on... sheesh... I got other things I could be doing with my time. :p
 
Guardian2003
Site Admin



Joined: Aug 28, 2003
Posts: 6799
Location: Ha Noi, Viet Nam

PostPosted: Tue Feb 07, 2012 11:20 pm Reply with quote

Sounds very complicated. Why not just use an FTP type functionality? [ Only registered users can see links on this board! Get registered or login! ] [ Only registered users can see links on this board! Get registered or login! ]

Your last screen shot looked really nice and I'm all for 'instant gratification' but always keep in mind that if your using jQuery or some other library with a plug-in there is always the potential for stuff breaking due to version upgrade incompatibilities, which has to potential to become a complete nightmare unless your very comfortable with javascript.
 
View user's profile Send private message Send e-mail
killing-hours







PostPosted: Wed Feb 08, 2012 8:45 am Reply with quote

Somewhat complicated... but everything follows a path and logic is my worst blessing the good one above cursed me with. Wink

I already have the upload functionality worked out... it's a matter of refining it to provide better error messaging / code cleanup etc... but it's more or less done. I used a jquery plugin that I use daily here at the office and know the jist of how it works and how to manipulate it pretty well.

The last screen shot is of the editing the albums once they are created. Instead of doing a traditional 1 for 1 edit where the user would edit one album at a time, I wrote a method for dynamically building a form when changes are made then submitting that information to a script to further process and build a dynamic update query and at the same time manage the folder information on the server to mirror the changes.

In a nutshell... how the user organizes the gallery to look... is how the file structure is mirrored on the server. Reason being... for w/e reason the site is down and can't be accessed... the user could ftp in and the gallery structure will be exactly the same.

As for being comfortable with javascript/jquery....

Code:
/* Edit Albums */

function SX_editAlbums(){
   var swankXibit = $('#modName').val(),
      SX_FormPage = 'admin.php?op=SwankManForms',
       ajax = 'ajax=1',
        manSelect = 'manSelect=1';
        adminPlaceHolder = $('#adminPlaceHolder'),
      adminDataWrapper = $('#adminDataWrapper'),
      pageVerify = $('#pageVerify'),
      infoMsg = $('.SX_informationMessage'),
      loading = '<span class="SX_msgLoading">Loading...</span> <img align="right" src="modules/' + swankXibit + '/includes/images/ajax-loader.gif" />',
      waiting = '<span class="SX_msgTimeout">Waiting to update</span><p><input type="button" id="submitAlbumUpdate" value="Submit Updates" /></p>';
         if (pageVerify.val() == 'editAlbums') {
            return false;
         }
            infoMsg.html(loading).css('display', 'block');
         $.ajax({
                type: 'POST',
                url: SX_FormPage,
            timeout: ajaxTimeout,
                data: ajax + '&' + manSelect,
            dataType: 'json',
                success: function (json) {
               
            
               var activeDropArray = new Array(),
                  parentDropArray = new Array()
                  tempAlbumArray = new Array();
                  
                  tempAlbumArray.push({'albumID':0,'albumTitle':'Main Index'});
               temp = '<input type="hidden" id="pageVerify" value="editAlbums" /> \
                        <form id="SX_editAlbumsForm">'+json.csrf_token+'<table cellpadding="0" cellspacing="0" border="0" id="editAlbumsTable" width="100%"> \
                           <thead> \
                              <tr> \
                                 <th>Title</th> \
                                 <th>Description</th> \
                                 <th>Parent</th> \
                                 <th>Status</th> \
                              </tr> \
                           </thead> \
                           <tbody>';
               
               
               $(json.album).each(function(i,item){
                  row  = '<tr><td class="ajax_title SX_tableText" albumid="'+item['albumID']+'">'+item['albumTitle']+'</td>';
                  row += '<td class="ajax_descript SX_tableText" albumid="'+item['albumID']+'">'+item['albumDescript']+'</td>';
                  row += '<td class="center SX_tableText ajax_parent" albumid="'+item['albumID']+'">'+item['parentName']+'</td>';
                  row += '<td class="center SX_tableText ajax_active" albumid="'+item['albumID']+'">'+item['active']+'</td></tr>';
                  temp += row;
                  
                  activeDropArray.push({
                     'albumID': item['albumID'],
                     'activeDrop': item['activeDrop']
                  });
                  
                  parentDropArray.push({
                     'albumID': item['albumID'],
                     'parentDrop': item['parentDrop']   
                  });
                  
                  tempAlbumArray.push({
                     'albumID': item['albumID'],
                     'albumTitle': item['albumTitle']
                  });
                  
               });
               
               
               
      
               
               
               temp += '</tbody> \
                                 <tfoot> \
                              <tr> \
                                 <th>Title</th> \
                                 <th>Description</th> \
                                 <th>Parent</th> \
                                 <th>Status</th> \
                              </tr> \
                           </tfoot> \
                        </table></form>';
               
               
               
               
                    adminPlaceHolder.html(temp);
            var pageVerify = $('#pageVerify'),
               albumID = null,
               albumTitle = null,
               albumDescript = null;
               adminDataWrapper.css('visibility','visible');
                    pageVerify.attr('value', 'editAlbums'),
               editAlbumsTable = $('#editAlbumsTable'),
               infoMsg.html('<span class="SX_msgLoaded">Loaded</span>').show().delay(infoMsgDelay).fadeOut(infoMsgFadeOut);
                    editAlbumsTable.dataTable({"bJQueryUI": true});
            
      
               
               
               
               
               
               $('#editAlbumsTable').delegate('.ajax_title, .ajax_descript, .ajax_active, .ajax_parent','mouseenter mouseleave',function(e){
                  if(e.type == 'mouseenter'){
                     if($(this).hasClass('ajax_title')){ // is the title table cell
                        albumID = $(this).attr('albumid'),
                        albumTitle = $(this).html();
                        if($(this).hasClass('changed')){
                           return false;
                        }
                        $(this).html('<input type="input" maxlength="100" name="title'+albumID+'" value="'+albumTitle+'" />').parent().addClass('SX_editAlbumsTR');
                     
                     }else if($(this).hasClass('ajax_descript')){ // is the description table cell
                        albumID = $(this).attr('albumid'),
                        albumDescript = $(this).html();
                        if($(this).hasClass('changed')){
                           return false;
                        }
                        $(this).html('<input type="input" name="descript'+albumID+'" value="'+albumDescript+'" />').parent().addClass('SX_editAlbumsTR');
                           
                     }else if($(this).hasClass('ajax_parent')){ // is the parent select table cell
                        /*if($(this).hasClass('changed')){
                           return false;
                        }*/
                        
                        
                        albumID = $(this).attr('albumID');
                        $.each(parentDropArray,function(i,item){
                           if(albumID == item['albumID']){
                              temp = item['parentDrop'];   
                           }
                        });
                        
                        tempAlbumName = $(this).html();
                        $.each(tempAlbumArray,function(i,item){
                           if(tempAlbumName == item['albumTitle']){
                              tempAlbumName = item['albumTitle'];
                              tempAlbumID = item['albumID'];
                           }
                        });
                        
                        $(this).parent().addClass('SX_editAlbumsTR');
                        
                        
                        var pos=$(this).offset(),
                           h=$(this).height(),
                           w=$(this).width(),
                           tempSelector = $(this);
                        
                        $('.SX_selectContainer').css({ left: pos.left + 85 , top: pos.top  - 10 }).html(temp).show().addClass('hold hold2 holdMe');
                        
                        
                        $('.SX_parentOption').click(function(){
                           if ($.inArray(albumID, albumIDArray) === -1) {
                                 albumIDArray.push(albumID);
                           }
                           selVal = $('.SX_parentSelect').val();
                              if(selVal != tempAlbumID){
                                 $.each(tempAlbumArray,function(i,item){
                                    if(selVal == item['albumID']){
                                       tempNewSel = item['albumTitle'];
                                    }
                                 });
                              }

                           
                           tempSelector.html(tempNewSel+'<input type="hidden" id="tempParSel'+albumID+'" value="'+tempAlbumID+'" /><input type="hidden" name="parent'+albumID+'" value="'+selVal+'" />').css({'color':'red','font-weight':'bold'}).parent().addClass('SX_waitingUpdate');
                           infoMsg.html(waiting).show();
                           setTimeout(function(){
                              if($('.SX_selectContainer').hasClass('hold') && $('.SX_selectContainer').hasClass('holdMe') && $('.SX_selectContainer').hasClass('hold2')){
                              
                              }else{
                              $('.SX_selectContainer').hide();
                              //$(this).parent().removeClass('SX_editAlbumsTR');
                              //temp = null;
                              }
                           },1000);
                        });

                        
                     }else if($(this).hasClass('ajax_active')){ // is the active table cell
                        /*if($(this).hasClass('changed')){
                           return false;
                        }*/
                        
                        
                        albumID = $(this).attr('albumID');
                        $.each(activeDropArray,function(i,item){
                           if(albumID == item['albumID']){
                              temp = item['activeDrop'];   
                           }
                        });
                        
                        $(this).parent().addClass('SX_editAlbumsTR');
                        
                        var pos=$(this).offset(),
                           h=$(this).height(),
                           w=$(this).width(),
                           tempSelector = $(this),
                           oldSelVal = $(this).html();
                        
                        if(oldSelVal == 'Active'){
                           oldSelVal = 1;
                        }else{
                           oldSelVal = 0;
                        }
                        $('.SX_selectContainer').css({ left: pos.left + w, top: pos.top  - 10 }).html(temp).show().addClass('hold hold2 holdMe');
                        
                        
                        $('.SX_activeOption').click(function(){
                           if ($.inArray(albumID, albumIDArray) === -1) {
                                 albumIDArray.push(albumID);
                           }
                           
                           selVal = $('.SX_activeSelect').val();
                           if(selVal == 0){
                              selWord = 'Inactive';
                              cssCol = 'red';
                           }else if(selVal == 1){
                              selWord = 'Active';
                              cssCol = 'green';
                           }
                           
                           tempSelector.html(selWord+'<input type="hidden" id="tempSel'+albumID+'" value="'+oldSelVal+'" /><input type="hidden" name="active'+albumID+'" value="'+selVal+'" />').css({'color':cssCol,'font-weight':'bold'}).parent().addClass('SX_waitingUpdate');
                           infoMsg.html(waiting).show();
                           setTimeout(function(){
                              if($('.SX_selectContainer').hasClass('hold') && $('.SX_selectContainer').hasClass('holdMe') && $('.SX_selectContainer').hasClass('hold2')){
                              
                              }else{
                              $('.SX_selectContainer').hide();
                              //$(this).parent().removeClass('SX_editAlbumsTR');
                              //temp = null;
                              }
                           },1000);
                        });
                           
                     }
                  }else if(e.type == 'mouseleave'){ // Begin the mouse leaving stuff
                     if($(this).hasClass('ajax_title')){
                        if($('input[name="title'+albumID+'"]').val() != albumTitle){
                           $(this).css('background-color','').addClass('changed').parent().addClass('SX_waitingUpdate').removeClass('SX_editAlbumsTR');
                               if ($.inArray(albumID, albumIDArray) === -1 && $(this).hasClass('changed')) {
                                 albumIDArray.push(albumID);
                               }
                           temp = null;
                           infoMsg.html(waiting).show();
                           return false;   
                        }
                        $(this).html(albumTitle).css('background-color','').parent().removeClass('SX_editAlbumsTR');
                        temp = null;
                     }else if($(this).hasClass('ajax_descript')){
                        if($('input[name="descript'+albumID+'"]').val() != albumDescript){
                           $(this).css('background-color','').addClass('changed').parent().addClass('SX_waitingUpdate').removeClass('SX_editAlbumsTR');
                              if ($.inArray(albumID, albumIDArray) === -1 && $(this).hasClass('changed')) {
                                 albumIDArray.push(albumID);
                               }
                           temp = null;
                           infoMsg.html(waiting).show();
                           return false;      
                        }
                        $(this).html(albumDescript).css('background-color','').parent().removeClass('SX_editAlbumsTR');
                        temp = null;
                        
                     }else if($(this).hasClass('ajax_parent')){
                           if($('#tempParSel'+albumID).val() != $('input[name="parent'+albumID+'"]').val && $('input[name="parent'+albumID+'"]').length > 0){
                              $(this).parent().addClass('SX_waitingUpdate').removeClass('SX_editAlbumsTR');
                              infoMsg.html(waiting).show();
                           }
                           $(this).parent().removeClass('SX_editAlbumsTR');
                           $('.SX_selectContainer').removeClass('hold2');
                           setTimeout(function(){
                              if($('.SX_selectContainer').hasClass('hold') && $('.SX_selectContainer').hasClass('holdMe') && $('.SX_selectContainer').hasClass('hold2')){
                              
                              }else{
                              $('.SX_selectContainer').hide();
                              $(this).parent().removeClass('SX_editAlbumsTR');
                              temp = null;
                              }
                           },1000);
                     
                     
                     }else if($(this).hasClass('ajax_active')){
                           if($('#tempSel'+albumID).val() != $('input[name="active'+albumID+'"]').val() && $('input[name="active'+albumID+'"]').length > 0){
                              $(this).parent().addClass('SX_waitingUpdate').removeClass('SX_editAlbumsTR');
                              infoMsg.html(waiting).show();
                           }
                           $(this).parent().removeClass('SX_editAlbumsTR');
                           $('.SX_selectContainer').removeClass('hold2');
                           setTimeout(function(){
                              if($('.SX_selectContainer').hasClass('hold') && $('.SX_selectContainer').hasClass('holdMe') && $('.SX_selectContainer').hasClass('hold2')){
                              
                              }else{
                              $('.SX_selectContainer').hide();
                              $(this).parent().removeClass('SX_editAlbumsTR');
                              temp = null;
                              }
                           },1000);
                     }
                  }
               });
                  

                },
               error: function (xhr, time, err) {
            if (time === 'timeout') {
               infoMsg.html('<span class="SX_msgTimeout">The request timed out</span>').show().delay(infoMsgDelay).fadeOut(infoMsgFadeOut);
            } else {
               infoMsg.html('<span class="SX_msgError">ERROR!\nreadyState: ' + xhr.readyState + '\nstatus: ' + xhr.status + '</span>').show().delay(infoMsgDelay).fadeOut(infoMsgFadeOut);
            }
        }
            });   
}


I'd say I've got a decent handle on it... but there is always room for improvement. (this is "dirty" code btw... it needs a good cleaning when I'm satisfied with it's functionality)
 
duck
Involved
Involved



Joined: Jul 03, 2006
Posts: 273

PostPosted: Tue Feb 14, 2012 4:03 pm Reply with quote

@killing-hours It sounds as though you suffer from the same perfectionism characteristic flaw that I do! lol It sounds as though you are over-designing the system from the outset instead of designing a simplistic starting functionality that will suffice from the start of which you can later improve and add those killer features to as time permits. I do this all the time and the projects become too much time (of which I often have little to spare) to complete and then either never get done or at least take a lot longer than they should have. Something I am trying to work on myself is when I have that vision of how I'd like it to be I ask myself what is the most important piece of that and how can I get that done as simply and quickly as possible?

Now I did not study your code (without comments it would take too much time to analyze) but I think if your concern is the structure of file system and to have it match a DB structure I wold consider a hierarchy of something like the following:

Galleries/Gallery1
Galleries/Gallery1/Album1
Galleries/Gallery1/Album1/SubAlbum1
Galleries/Gallery1/Album1/SubAlbum2
Galleries/Gallery1/Album1/SubAlbum3
Galleries/Gallery1/Album2
Galleries/Gallery1/Album2/SubAlbum1
Galleries/Gallery1/Album2/SubAlbum2
Galleries/Gallery2
Galleries/Gallery2/Album1
Galleries/Gallery2/Album1/SubAlbum1

etc..

Then you can use a MPTT (Moddified Pre-order Tree Traversal) function for your database.

If it were me I think I would order the editing class file to perform first file manipulations and upon success then update the DB records to match. If failing the DB update I might try to create a file log of the error (that is checked upon module admin start up) as well as display output to inform the admin that the file system and DB are not in sync. If your function to read the file structure (for displaying your list of files) is built as modular as possible you should be able to reuse all (or most of) the code from that to resync later.

That said nice work and I like your ideas!
 
View user's profile Send private message
killing-hours







PostPosted: Tue Feb 14, 2012 4:25 pm Reply with quote

duck, This is by FARRRRRRRR the most ambitious undertaking I've attempted yet.... No doubt about it... however, I'm as tenacious as a pitbull and when my mind is made up... it's a done deal.

I've already figured out how to mange the data on the server and keep it in more or less sync with the database. (granted no permission issues or problems moving). In such a case... the admin will have to clean up the mess.

As for the MPTT, iGallery took that route and the queries for it where enormous. I chose to go with a recursive approach and keep the queries simplified and clean. How this will impact performance on huge galleries... I couldn't tell you at this point... however, If you're attempting to host a huge gallery with this.. you're asking for trouble. This gallery is more or less meant for simple galleries and nothing "youtube" like.

Basically I'm going to create this for my liking and if others want to use it... more power to them but I'm not trying to create the next Youtube. They have massive backends to handle the load whereas site admins "generally" run more or less simple sites by comparison.

As for determining functionality... well... here's how to break it down.

1. Uploading
2. Managing
3. Settings
4. Functionality

Those are the four "basic" things a gallery needs to do. From that there are quite a few sub issues for each and within those sub issues error reporting has to be accounted for.

I've got a fairly decent handle on what is going on and more or less what "needs" to be done... the one factor in all this that really matters is... Time.

Also, the code you looked at is old. I'm not using that code anymore and have already re-coded the "majority" of the new code and am still coding up the functionality of what matters the most... "management".

Once the management code is complete... everything else is fluff.

Appreciate the response though. Thanks for the compliment. Wink
 
killing-hours







PostPosted: Fri Feb 17, 2012 11:35 am Reply with quote

Another update on the project...

The biggest hurdle has been crossed. Smile After 5 days of INTENSE coding... I finally managed to pull off the dynamic album updating.

The processing script:
Code:
      $albumIDArray = explode(',', $_POST['albumIDArray']);

         foreach($albumIDArray as $albumID){
            $dynamicAlbumTitle = "";
            $dynamicAlbumDescript = "";
            $dynamicAlbumParent = "";
            $dynamicAlbumStatus = "";
            $dynamicFolderName = "";
            $folderNameRegex = '%(?:/|\?|\*|:|;|\{|\}|\\\\)\Z%';
            $newFolderName = NULL;
            $commaTrigg = 0;
            $albumsRealPath = swankPath($swankConfig['albums_path']);
            $thumbsRealPath = swankPath($swankConfig['thumbs_path']);
               // Get info from the post for manipulation   
               if(preg_match($folderNameRegex,$_POST['title'.$albumID])){
                  $error[] = _SX_AP_ILLEGALCHARS;
               }
               if(preg_match($folderNameRegex,$_POST['descript'.$albumID])){
                  $error[] = _SX_AP_ILLEGALCHARS;
               }
               
               $albumTitle = $db->real_escape_string(trim($_POST['title'.$albumID]));
               $albumDescript = $db->real_escape_string(htmlentities(trim($_POST['descript'.$albumID]), ENT_QUOTES));
               $albumParent = $_POST['parent'.$albumID];
               $albumStatus = $_POST['active'.$albumID];
               
               $getAlbumInfo = $db->sql_fetchrow($db->sql_query('SELECT album_title, album_id, parent_id, album_folder FROM '.$prefix.'_swank_albums WHERE album_id='.$albumID.' LIMIT 1'));
               
               // Ensure we are not moving top level down within sub album of self
               $childArray = hasChildrenArray($albumID);
                  if(in_array($albumParent,$childArray)){
                     $error[] = 'You cannot move parent directory within sub directory of itself: '.$getAlbumInfo['album_title'];
                  }
               
               
               
               if(empty($error)){
                  // If our album title is not null for this album ID
                  if($albumTitle != NULL){
                     $dynamicAlbumTitle = 'album_title="'.$albumTitle.'"';
                     $commaTrigg = 1;
                     $newFolderName = str_replace(' ','_', $_POST['title'.$albumID]);
                     // if our parent id of this album is the main index we set the "parent" path for the main index
                     if($getAlbumInfo['parent_id'] == 0){
                        $oldFolderPath = $albumsRealPath.$getAlbumInfo['album_folder'];
                        $newFolderPath = $albumsRealPath.$newFolderName;
                        $oldThumbPath = $thumbsRealPath.$getAlbumInfo['album_folder'];
                        $newThumbPath = $thumbsRealPath.$newFolderName;
                     // otherwise we build our parent path from /ablums down until we reach ourself
                     }else{
                        $parentPath =  buildParentPath($getAlbumInfo['parent_id']);
                        $subAlbumPath  = $albumsRealPath.$parentPath;
                        $subThumbPath  = $thumbsRealPath.$parentPath;
                        $oldFolderPath = $albumsRealPath.$parentPath.'/'.$getAlbumInfo['album_folder'];
                        $newFolderPath = $subAlbumPath.'/'.$newFolderName;
                        $oldThumbPath = $thumbsRealPath.$parentPath.'/'.$getAlbumInfo['album_folder'];
                        $newThumbPath = $subThumbPath.'/'.$newFolderName;
                     }
                     // if the folder name is not empty, we set our dynamic query up to update this field
                     if($newFolderName != NULL){
                        $dynamicFolderName = ',album_folder="'.$newFolderName.'"';
                           
                           // rename the folder on the server to reflect what will be in the database   
                           if(empty($error)){
                              $rename = rename($oldFolderPath,$newFolderPath);
                           }
                           // if we have a problem renaming
                           if($rename === FALSE){
                              $error[] = 'Error renaming album folder';   
                           }
                           if(empty($error)){
                              $renameThumbs = rename($oldThumbPath,$newThumbPath);
                           }
                           if($renameThumbs === FALSE){
                              $error[] = 'Error renaming thumb folder';
                           }
                        
                     }

                  // if the album title is null, get the title of the album being updated   
                  }else{
                     $getTitle = $db->sql_fetchrow($db->sql_query('SELECT album_title, album_id FROM '.$prefix.'_swank_albums WHERE album_id='.$albumID.' LIMIT 1'));
                     $albumTitle = $getTitle['album_title'];
                     $titleSwitch = 1;   
                  }
                  

                  
                  // if the album description is not empty we set the query up to update this field
                  if($albumDescript != NULL){
                     if($commaTrigg == 0){
                        $dynamicAlbumDescript = 'album_description="'.$albumDescript.'"';
                        $commaTrigg = 1;
                     }else{
                        $dynamicAlbumDescript = ',album_description="'.$albumDescript.'"';
                        $commaTrigg = 1;
                     }
                  }
                  
                  
                  
                  
                  if($albumParent != NULL){
                     //global $newFolderName;
                     require_once('modules/'.$swankXibit.'/includes/dirtool/class_dirtool.php');
                     // Build our mov paths
                     $getAlbumInfo = $db->sql_fetchrow($db->sql_query('SELECT album_title, album_id, parent_id, album_folder FROM '.$prefix.'_swank_albums WHERE album_id='.$albumID.' LIMIT 1'));
                     $myCurrentPath = buildParentPath($albumID);
                     $albumSource = $albumsRealPath.$myCurrentPath;
                     $thumbSource = $thumbsRealPath.$myCurrentPath;
                     $getParantQuery = $db->sql_fetchrow($db->sql_query('SElECT album_id, parent_id FROM '.$prefix.'_swank_albums WHERE parent_id='.$albumParent));
                     $parentNewPath = buildParentPath($albumParent);
                     
                     
                     if($albumParent == 0){
                        
                        $albumDest = $albumsRealPath.$getAlbumInfo['album_folder'];
                        $thumbDest = $thumbsRealPath.$getAlbumInfo['album_folder'];
                        
                        if($newFolderName != NULL){
                           $myCurrentPath = str_replace('/'.$getAlbumInfo['album_folder'],'/',$myCurrentPath);
                           $albumSource = $albumsRealPath.$myCurrentPath.$newFolderName;
                           $thumbSource = $thumbsRealPath.$myCurrentPath.$newFolderName;   
                           $albumDest = $albumsRealPath.$newFolderName;
                           $thumbDest = $thumbsRealPath.$newFolderName;
                        }
                        
                        
                        
                     }else{
                     
                              $parentNewPath = str_replace($getAlbumInfo['album_folder'].'/','',$parentNewPath);
                              $albumDest = $albumsRealPath.$parentNewPath.'/'.$getAlbumInfo['album_folder'];
                              $thumbDest = $thumbsRealPath.$parentNewPath.'/'.$getAlbumInfo['album_folder'];
                        
                        
                        if($newFolderName != NULL){
                           $myCurrentPath = str_replace('/'.$getAlbumInfo['album_folder'],'/',$myCurrentPath);
                           
                           if($getAlbumInfo['parent_id'] == 0){   
                              $parentNewPath = str_replace($getAlbumInfo['album_folder'].'/','',$parentNewPath);
                              $albumSource = $albumsRealPath.$newFolderName;
                              $thumbSource = $thumbsRealPath.$newFolderName;
                              $albumDest = $albumsRealPath.$parentNewPath.'/'.$newFolderName;
                              $thumbDest = $thumbsRealPath.$parentNewPath.'/'.$newFolderName;
                           }else{
                              $albumSource = $albumsRealPath.$myCurrentPath.$newFolderName;
                              $thumbSource = $thumbsRealPath.$myCurrentPath.$newFolderName;
                              $albumDest = $albumsRealPath.$parentNewPath.'/'.$newFolderName;
                              $thumbDest = $thumbsRealPath.$parentNewPath.'/'.$newFolderName;   
                           }
                        
                        }
                     
                     }
                     
                     
                     if(empty($error)){
                     // Move album dirctory
                     $Adir = new dirtool($albumSource);
                     $Adir->move($albumDest);
                     // Move thumb directory
                     $Tdir = new dirtool($thumbSource);
                     $Tdir->move($thumbDest);
                     }
                     
                     if($commaTrigg == 0){
                        $dynamicAlbumParent = 'parent_id="'.$albumParent.'"';
                        $commaTrigg = 1;
                     }else{
                        $dynamicAlbumParent = ',parent_id="'.$albumParent.'"';
                        $commaTrigg = 1;
                     }                                 
                  }
                  
                  

                  
                  // if the album status is not empty we set the query up to update this field
                  if($albumStatus != NULL){
                     if($commaTrigg == 0){
                        $dynamicAlbumStatus = 'album_active="'.$albumStatus.'"';
                        $commaTrigg = 1;
                     }else{
                        $dynamicAlbumStatus = ',album_active="'.$albumStatus.'"';
                        $commaTrigg = 1;
                     }   
                  }
                  
         if(empty($error)){         
            // Update the information for this album ID
            $updateAlbum = $db->sql_query('UPDATE '.$prefix.'_swank_albums SET '.$dynamicAlbumTitle.' '.$dynamicAlbumDescript.' '.$dynamicAlbumParent.' '.$dynamicAlbumStatus.' '.$dynamicAlbumPath.' '.$dynamicFolderName.' WHERE album_id='.$albumID);
            // if we have a problem updating
            if($updateAlbum === FALSE){
               $error[] = 'Error submitting to database';
            }else{
               if($titleSwitch == 0){
                  $success[] = '<b>'.$_POST['title'.$albumID].'</b> updated successfully!';
               }elseif($titleSwitch == 1){
                  $success[] = '<b>'.$albumTitle.'</b> updated successfully!';   
               }
            }
         }
               } // End no error
         // set out trigger back to 0 for the next pass
         $commaTrigg = 0;
      } // End album ID foreach loop
   } // End if edit album form
// Send our data back to the jquery for display
$returnArray = array('success'=>$success,'error'=>$error);
echo json_encode($returnArray);
exit();



The jquery magic:
Code:
/* Edit Albums */


function SX_editAlbums() {
    var swankXibit = $('#modName').val(),
        SX_FormPage = 'admin.php?op=SwankManForms',
        ajax = 'ajax=1',
        manSelect = 'manSelect=1';
    var adminPlaceHolder = $('#adminPlaceHolder'),
        adminDataWrapper = $('#adminDataWrapper'),
        pageVerify = $('#pageVerify'),
        infoMsg = $('.SX_informationMessage'),
        loading = '<span class="SX_msgLoading">Loading...</span> <img align="right" src="modules/' + swankXibit + '/includes/images/ajax-loader.gif" />',
        waiting = '<span class="SX_msgTimeout">Waiting to update</span><p><span class="SX_success SX_btnSubmitAlbumUpdate">Submit Updates</span></p>';
    if (pageVerify.val() == 'editAlbums') {
        return false;
    }
    infoMsg.clearQueue().stop(true, true).html(loading).css('display', 'block');
    $.ajax({
        type: 'POST',
        url: SX_FormPage,
        timeout: ajaxTimeout,
        data: ajax + '&' + manSelect,
        dataType: 'json',
        success: function (json) {
            var activeDropArray = new Array(),
                parentDropArray = new Array()
                tempAlbumArray = new Array(),
                albumIDArray = new Array();
            tempAlbumArray.push({
                'albumID': 0,
                'albumTitle': 'Main Index'
            });
            temp = '<input type="hidden" id="pageVerify" value="editAlbums" /> \
                        <form id="SX_editAlbumsForm">' + json.csrf_token + '<table cellpadding="0" cellspacing="0" border="0" id="editAlbumsTable" width="100%"> \
                           <thead> \
                              <tr> \
                                 <th class="SX_tableView">Title</th> \
                                 <th class="SX_tableView">Description</th> \
                                 <th class="SX_tableView">Parent</th> \
                                 <th class="SX_tableView">Status</th> \
                              </tr> \
                           </thead> \
                           <tbody>';
            $(json.album).each(function (i, item) {
                row = '<tr><td class="ajax_title SX_tableText" albumid="' + item['albumID'] + '">' + item['albumTitle'] + '</td>';
                row += '<td class="ajax_descript SX_tableText" albumid="' + item['albumID'] + '">' + item['albumDescript'] + '</td>';
                row += '<td class="center SX_tableText ajax_parent" albumid="' + item['albumID'] + '">' + item['parentName'] + '</td>';
                row += '<td class="center SX_tableText ajax_active" albumid="' + item['albumID'] + '">' + item['active'] + '</td></tr>';
                temp += row;

                activeDropArray.push({
                    'albumID': item['albumID'],
                    'activeDrop': item['activeDrop']
                });
                parentDropArray.push({
                    'albumID': item['albumID'],
                    'parentDrop': item['parentDrop']
                });
                tempAlbumArray.push({
                    'albumID': item['albumID'],
                    'albumTitle': item['albumTitle']
                });

            });
            temp += '</tbody> \
                                 <tfoot> \
                              <tr> \
                                 <th class="SX_tableView">Title</th> \
                                 <th class="SX_tableView">Description</th> \
                                 <th class="SX_tableView">Parent</th> \
                                 <th class="SX_tableView">Status</th> \
                              </tr> \
                           </tfoot> \
                        </table></form>';
            adminPlaceHolder.html(temp); //draw the table and data to the page
            var pageVerify = $('#pageVerify'),
                albumID = null,
                albumTitle = null,
                albumDescript = null;
            adminDataWrapper.css('visibility', 'visible');
            pageVerify.attr('value', 'editAlbums'), editAlbumsTable = $('#editAlbumsTable'), infoMsg.clearQueue().stop(true, true).html('<span class="SX_msgLoaded">Loaded</span>').show().delay(infoMsgDelay).fadeOut(infoMsgFadeOut);
            editAlbumsTable.dataTable({
                "bJQueryUI": true
            });

            $('#editAlbumsTable').delegate('.ajax_title, .ajax_descript, .ajax_active, .ajax_parent', 'mouseenter mouseleave', function (e) {
                if (e.type == 'mouseenter') {
                    if ($(this).hasClass('ajax_title')) { // is the title table cell
                        albumID = $(this).attr('albumid'), albumTitle = $(this).html();
                        if ($(this).hasClass('changed')) {
                            return false;
                        }
                        $(this).html('<input type="input" maxlength="100" name="title' + albumID + '" value="' + albumTitle + '" />').parent().addClass('SX_editAlbumsTR');
                    } else if ($(this).hasClass('ajax_descript')) { // is the description table cell
                        albumID = $(this).attr('albumid'), albumDescript = $(this).html();
                        if ($(this).hasClass('changed')) {
                            return false;
                        }
                        $(this).html('<input type="input" name="descript' + albumID + '" value="' + albumDescript + '" />').parent().addClass('SX_editAlbumsTR');
                    } else if ($(this).hasClass('ajax_parent')) { // is the parent select table cell
                        albumID = $(this).attr('albumID');
                        $.each(parentDropArray, function (i, item) {
                            if (albumID == item['albumID']) {
                                temp = item['parentDrop'];
                            }
                        });
                        tempAlbumName = $(this).html();
                        $.each(tempAlbumArray, function (i, item) {
                            if (tempAlbumName == item['albumTitle']) {
                                tempAlbumName = item['albumTitle'];
                                tempAlbumID = item['albumID'];
                            }
                        });
                        $(this).parent().addClass('SX_editAlbumsTR');
                        var pos = $(this).offset(),
                            tempSelector = $(this),
                            yAxis = e.clientY;
                        $('.SX_selectContainer').css({
                            left: pos.left + 95,
                            top: yAxis - 18
                        }).html(temp).show().addClass('hold hold2 holdMe');
                        $('.SX_parentOption').click(function () {
                            if ($.inArray(albumID, albumIDArray) === -1) {
                                albumIDArray.push(albumID);
                            }
                            selVal = $('.SX_parentSelect').val();
                            if (selVal != tempAlbumID) {
                                $.each(tempAlbumArray, function (i, item) {
                                    if (selVal == item['albumID']) {
                                        tempNewSel = item['albumTitle'];
                                    }
                                });
                            }
                            tempSelector.html(tempNewSel + '<input type="hidden" id="tempParSel' + albumID + '" value="' + tempAlbumID + '" /><input type="hidden" name="parent' + albumID + '" value="' + selVal + '" />').css({
                                'color': 'red',
                                'font-weight': 'bold'
                            }).parent().addClass('SX_waitingUpdate');
                            infoMsg.clearQueue().stop(true, true).html(waiting).show();
                            setTimeout(function () {
                                if ($('.SX_selectContainer').hasClass('hold') && $('.SX_selectContainer').hasClass('holdMe') && $('.SX_selectContainer').hasClass('hold2')) {

                                } else {
                                    $('.SX_selectContainer').hide();
                                    //$(this).parent().removeClass('SX_editAlbumsTR');
                                    //temp = null;
                                }
                            }, 1000);
                        });
                    } else if ($(this).hasClass('ajax_active')) { // is the active table cell
                        albumID = $(this).attr('albumID');

                        $.each(activeDropArray, function (i, item) {
                            if (albumID == item['albumID']) {
                                temp = item['activeDrop'];
                            }
                        });
                        $(this).parent().addClass('SX_editAlbumsTR');
                        var pos = $(this).offset(),
                            tempSelector = $(this),
                            yAxis = e.clientY
                            oldSelVal = $(this).html();
                        if (oldSelVal == 'Active') {
                            oldSelVal = 1;
                        } else {
                            oldSelVal = 0;
                        }
                        $('.SX_selectContainer').css({
                            left: pos.left + 95,
                            top: e.clientY - 18
                        }).html(temp).show().addClass('hold hold2 holdMe');
                        $('.SX_activeOption').click(function () {
                            if ($.inArray(albumID, albumIDArray) === -1) {
                                albumIDArray.push(albumID);
                            }
                            selVal = $('.SX_activeSelect').val();
                            if (selVal == 0) {
                                selWord = 'Inactive';
                                cssCol = 'red';
                            } else if (selVal == 1) {
                                selWord = 'Active';
                                cssCol = 'green';
                            }
                            tempSelector.html(selWord + '<input type="hidden" id="tempSel' + albumID + '" value="' + oldSelVal + '" /><input type="hidden" name="active' + albumID + '" value="' + selVal + '" />').css({
                                'color': cssCol,
                                'font-weight': 'bold'
                            }).parent().addClass('SX_waitingUpdate');
                            infoMsg.clearQueue().stop(true, true).html(waiting).show();
                            setTimeout(function () {
                                if ($('.SX_selectContainer').hasClass('hold') && $('.SX_selectContainer').hasClass('holdMe') && $('.SX_selectContainer').hasClass('hold2')) {

                                } else {
                                    $('.SX_selectContainer').hide();
                                    //$(this).parent().removeClass('SX_editAlbumsTR');
                                    //temp = null;
                                }
                            }, 1000);
                        });

                    }
                } else if (e.type == 'mouseleave') { // Begin the mouse leaving stuff
                    if ($(this).hasClass('ajax_title')) {
                        if ($('input[name="title' + albumID + '"]').val() != albumTitle) {
                            $(this).css('background-color', '').addClass('changed').parent().addClass('SX_waitingUpdate').removeClass('SX_editAlbumsTR');
                            if ($.inArray(albumID, albumIDArray) === -1 && $(this).hasClass('changed')) {
                                albumIDArray.push(albumID);
                            }
                            temp = null;
                            infoMsg.clearQueue().stop(true, true).html(waiting).show();
                            return false;
                        }
                        $(this).html(albumTitle).css('background-color', '').parent().removeClass('SX_editAlbumsTR');
                        temp = null;
                    } else if ($(this).hasClass('ajax_descript')) {
                        if ($('input[name="descript' + albumID + '"]').val() != albumDescript) {
                            $(this).css('background-color', '').addClass('changed').parent().addClass('SX_waitingUpdate').removeClass('SX_editAlbumsTR');
                            if ($.inArray(albumID, albumIDArray) === -1 && $(this).hasClass('changed')) {
                                albumIDArray.push(albumID);
                            }
                            temp = null;
                            infoMsg.clearQueue().stop(true, true).html(waiting).show();
                            return false;
                        }
                        $(this).html(albumDescript).css('background-color', '').parent().removeClass('SX_editAlbumsTR');
                        temp = null;
                    } else if ($(this).hasClass('ajax_parent')) {
                        if ($('#tempParSel' + albumID).val() != $('input[name="parent' + albumID + '"]').val && $('input[name="parent' + albumID + '"]').length > 0) {
                            $(this).parent().addClass('SX_waitingUpdate').removeClass('SX_editAlbumsTR');
                            infoMsg.clearQueue().stop(true, true).html(waiting).show();
                        }
                        $(this).parent().removeClass('SX_editAlbumsTR');
                        $('.SX_selectContainer').removeClass('hold2');
                        setTimeout(function () {
                            if ($('.SX_selectContainer').hasClass('hold') && $('.SX_selectContainer').hasClass('holdMe') && $('.SX_selectContainer').hasClass('hold2')) {

                            } else {
                                $('.SX_selectContainer').hide();
                                $(this).parent().removeClass('SX_editAlbumsTR');
                                temp = null;
                            }
                        }, 1000);
                    } else if ($(this).hasClass('ajax_active')) {
                        if ($('#tempSel' + albumID).val() != $('input[name="active' + albumID + '"]').val() && $('input[name="active' + albumID + '"]').length > 0) {
                            $(this).parent().addClass('SX_waitingUpdate').removeClass('SX_editAlbumsTR');
                            infoMsg.clearQueue().stop(true, true).html(waiting).show();
                        }
                        $(this).parent().removeClass('SX_editAlbumsTR');
                        $('.SX_selectContainer').removeClass('hold2');
                        setTimeout(function () {
                            if ($('.SX_selectContainer').hasClass('hold') && $('.SX_selectContainer').hasClass('holdMe') && $('.SX_selectContainer').hasClass('hold2')) {

                            } else {
                                $('.SX_selectContainer').hide();
                                $(this).parent().removeClass('SX_editAlbumsTR');
                                temp = null;
                            }
                        }, 1000);
                    }
                }
            });
        },
        error: function (xhr, time, err) {
            if (time === 'timeout') {
                infoMsg.clearQueue().stop(true, true).html('<span class="SX_msgTimeout">The request timed out</span>').show().delay(infoMsgDelay).fadeOut(infoMsgFadeOut);
            } else {
                infoMsg.clearQueue().stop(true, true).html('<span class="SX_msgError">ERROR!\nreadyState: ' + xhr.readyState + '\nstatus: ' + xhr.status + '</span>').show().delay(infoMsgDelay).fadeOut(infoMsgFadeOut);
            }
        }
    });
}


In passing this hurdle... it clears the way to finish out the rest of the management portion of the backend. 1 more "semi" massive function similar to this and 2 much smaller functions.

Uploading: Completed.
Management: 80%
Settings: 10%
Functionality: 50%

FFMPEG Support "Optional": Completed
Image Resizing (animated gif aware) "Optional": Completed
Front end layout with dynamic resizing: Completed

Commenting, Users & Rating will NOT be in the maiden release. I want to see how the gallery performs first & whether it's worth my time before attacking a that headache.

--------------------

A couple things to note while they are on my mind.

(1) Due to the speed in which this gallery operates, this may trigger blocking due to rapid requests hitting the server. This all depends on either the way you setup your server or how your shared server host has the server setup. Just something to keep in mind.

(2) Depending on how the apache/php environment is setup, you may need to edit some of the php settings to allow for more execution time and bigger file posts / max upload size in order to send files bigger than the limit. (default php file size is 2mb) If the server is setup so that php options can be overridden with .htaccess... you can set those in the .htaccess file. If you don't have that access, you might ask your provider to up the settings for you if they will. Same applies to those who run their own server, you may need to adjust your server to allow for more headroom for bigger filesizes.

(3) I have noticed while testing various functions that if I attempt to change something directly on the server that it will break the operation of the gallery due to the way php assigns ownership of the file. I've attempted to give EVERY tool needed to manage the gallery from the interface itself so that there "should" be no need to manage the files either by FTP or directly.

(4) Due to the way some .mp4's are encoded, they naturally do not "auto start" because the information needed is placed at the end of the file. FFMPEG has a plugin that "should" move this information to the front of the file so it can be streamed rather than downloading the entire file first before playing. I'll try to document this and how to set it up as well as provide a setting to enable this via the control panel if your server has this plugin available to FFMPEG.

(5) Vimeo has switched to an html5 media player and it uses the H.264 codec which some popular browsers do not support. Point.... it doens't play in that browser and for w/e reason I have yet to see it fall back to flash on failure. [ Only registered users can see links on this board! Get registered or login! ]

(6) Internet Explorer
Due to issue with Internet Explorer... I will not waste anymore time trying to debug it's problems. What a nightmare.
(6a) IE 8 - Does not support some of the methods used to make this gallery work. (may work on this after the gallery is finished)




I think I've brought you up to speed on where I'm at and the foreseeable problems that will accompany this gallery. Time to finish out the last leg of this year long project.
Shocked


Last edited by killing-hours on Thu Feb 23, 2012 1:57 pm; edited 1 time in total 
rjms
Regular
Regular



Joined: Feb 10, 2012
Posts: 56

PostPosted: Thu Feb 23, 2012 1:35 pm Reply with quote

This project is dead, or is there a post somewhere where people can watch it in action/buy?

_________________
Using RavenNuke 2.5 Freshly installed on a RHE Dedicated box. 
View user's profile Send private message
killing-hours







PostPosted: Thu Feb 23, 2012 1:42 pm Reply with quote

rjms wrote:
This project is dead, or is there a post somewhere where people can watch it in action/buy?


The project is NOT dead... I'm still actively working on it and working out the things that need working on. I have recently updated the post with information and where I stand on things... not sure how else I can convey it.

Please understand that I'm a young father who works full time (not in coding) and has 2 young children and also a wife who ALL need attention BEFORE I get to sink off into the bowls of endless code. It's a matter of finding the TIME to work on it and due to the way the scripts interact with the server, error checking and functionality are two important parts of the project.

You wouldn't want to spend your time uploading 200+ images only to find out that none of them went through and all failed silently.

By the same token... you wouldn't want to go and delete a folder with no option to delete or move sub albums / media to a differing parent album etc.

I could have completed a "simple" gallery just to display images relatively fast... but that doesn't go far enough. As the end user... you don't want to have to dig into the code to make the gallery do what it "should" do from the get go... It should have all the tools to manage the gallery from an interface so that you can point & click. It should also notify the end user of any errors along the way and stop operations on error in some places while continuing in others.

Then tie in the jquery functionality to make it "interactive" and finally spread that across 4 major browsers... all of which interrupt things differently.

You can start to see how this is more than just a simple file upload input on a form and a basic frontend to display a picture/video/audio.

Also, to my knowledge... there is no other media gallery module for RN or PHP Nuke for that matter that can handle Image / Video / Audio all in itself.

Patience is a virtue... all things in due time. Wink
 
rjms







PostPosted: Fri Feb 24, 2012 2:19 am Reply with quote

Yea sorry, when i load the page it still is not refreshed, this forum does not do a force refresh, not even on posts, so i did not see your post on the heads up.

I deeply regret of posting such a thing...

P.S. I know what a debacle wife and children can be at times Wink
 
montego
Site Admin



Joined: Aug 29, 2004
Posts: 9457
Location: Arizona

PostPosted: Fri Feb 24, 2012 7:00 am Reply with quote

rjms wrote:
P.S. I know what a debacle wife and children can be at times Wink


As well as how much a blessing and joy each brings to our lives. Smile

_________________
Where Do YOU Stand?
HTML Newsletter::ShortLinks::Mailer::Downloads and more... 
View user's profile Send private message Visit poster's website
killing-hours







PostPosted: Fri Feb 24, 2012 8:27 am Reply with quote

montego wrote:
rjms wrote:
P.S. I know what a debacle wife and children can be at times Wink


As well as how much a blessing and joy each brings to our lives. Smile


Couldn't agree more! My kids are both in their first years of school and right now I get the pleasure of teaching my son all the knowledge I've gained over my life. (one of my long held dreams coming true) It's a blast but it further strains my "hobby" time... but with good reason.

rjms, I hope I did not come off rude as I didn't mean it that way... it's just that when I do release this (free of charge) I want it to be something people actually enjoy to use and don't have to clean up messes I had the opportunity and ability to fix prior. I don't like "half assing" things and when I feel it's ready... it will be out here.

P.s. I'm right in the midst of starting a small business due to other businesses wanting me to maintain their websites. Things are all sorts of crazy right now... everyone wants my attention.
 
rjms







PostPosted: Fri Feb 24, 2012 3:56 pm Reply with quote

nah you were not rude, on the other hand I was though... and i'm deeply sorry for it
 
killing-hours







PostPosted: Fri Feb 24, 2012 4:03 pm Reply with quote

rjms, I didn't perceive it as rude... I just didn't want people to get the impression that the project was dead. It is defiantly still very active and my wife could give you an earful proving just how active. HitsFan

On a bright note though, as you were probably typing out your response... I finished the function for deleting albums. Wink Two more hardcore functions and then bring on the easy fluff. Smile
 
rjms







PostPosted: Fri Feb 24, 2012 4:49 pm Reply with quote

Can't wait to use it!
 
killing-hours







PostPosted: Mon Feb 27, 2012 11:19 am Reply with quote

Looking for input.

For those of you who plan to use this gallery, do you want the ability, if you have access to FFMPEG, to convert the videos to flv to reduce file sizes on the server? I have not given that a whole lot of thought nor planned on it... but was a thought I had in passing and can put it in when I do the settings management if it's wanted.

Let me know you opinion. Thanks.

P.s. I'm looking at you myrtletrees... you had some great input early on. Wink
 
spasticdonkey







PostPosted: Mon Feb 27, 2012 1:32 pm Reply with quote

Sounds like it could be handy, but by no means essential for me. Especially if it becomes a headache to get working Smile

I might have a couple of requests before you are totally done, but they have more to do with display. Depends on how your module is setup, but changes would likely be minor. Has to do with displaying the gallery on mobile devices, as I found a pretty cool mobile gallery script. Took a look at adding similar functionality to nuken's recent picasa galleries, but the method images are retrieved was too complex for me to tinker with at this time Smile
 
rjms







PostPosted: Mon Feb 27, 2012 1:42 pm Reply with quote

The use of FFMPEG would be a major breakthrough for our site as my members could upload to us instead of a *tube website as these websites often delete the content or delete the account os same user
 
duck







PostPosted: Mon Feb 27, 2012 1:47 pm Reply with quote

ffmpeg things is rather intensive and requires a dedicated server so if it were me I would skip (at least for now) because odds of most users using it are slim. You can always add it in later if you find people wanting it.
 
Guardian2003







PostPosted: Mon Feb 27, 2012 2:01 pm Reply with quote

I would be tempted to leave FFMPEG until a later release if it were me to see exactly what demand there was and investigate more fully the likely server resource consumption. That way I wouldn't be holding up the entire project for one small bit of none essential functionality.
 
killing-hours







PostPosted: Mon Feb 27, 2012 2:12 pm Reply with quote

Guys... I've already written the methods for retrieving video thumbnails via FFMPEG. I've already got a switch in place that can be set to use or not use FFMPEG. (this will be tweaked to disabled if the FFMPEG modules can't be located)

FFMPEG support is done... but I haven't given much thought to the "conversion" of videos on processing. As it stands now... videos stay in the current format HOWEVER, this means that they will be big files on the server. If I wrote in a method to convert the videos to flv (shouldn't be to hard)... then the files would be much smaller on the server. I just haven't given it much thought but it did cross my mind while researching things.

nuken, as far as I can tell... the gallery "should" display correctly in mobile devices if they are using more modern browsers. (which most smart phones do) I haven't tested any of this but I will now once I get to the stress testing aspect of things. I hope that you'll alpha test for me because I value your input on things. I'll contact you when I start refining the frontend so you can show me what you want to do with it.

duck, Guardian... FFMPEG conversion WILL put a huge demand on the server. Just the nature of the beast. So far... FFMPEG hasn't been a real heacache... the biggest hold up thus far has been working out the path's and dynamic updating methods, parenting system along with the jquery to make it all "pretty". It's been a nightmare but biggest battles seem to be behind me now and I can use the things I've learned winning those battles in the next couple rounds.

I agree though Guardian... I'm not sure how much demand there will be for a gallery module.. but from ALL the comments I've read online while researching before I began this... it's wanted BADLY.

Ugh.... if only I have 2 1/2 weeks of no daytime work or interruptions...
 
Display posts from previous:       
Post new topic   Reply to topic    Ravens PHP Scripts And Web Hosting Forum Index -> Modules

View next topic
View previous topic
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You can attach files in this forum
You can download files in this forum


Powered by phpBB © 2001-2007 phpBB Group
All times are GMT - 6 Hours
 
Forums ©