WHS ShowTime est un add-in de WHS permettant de voir et de partager les images de manières ludiques.
Il est développé dans le cadre du concours MSDN Coding4Fun
-Navigation par dossier
-Navigation par tag
-Navigation temporelle
-Navigation géographique
Cet Add-in utilise du C# pour la gestion d'extention de la console de WHS, du VBscript pour la récupération des info de Desktop Search et du HTML/Javascript pour les sites.
J'ai intégré dans le MSI l'executable de ExifTools, excellent outil de lecture de tags. Il permet de pallier aux limitations de WDS 2 de la version actuelle de WHS.
Source / Exemple :
//Source principale de l'Add-in
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace Microsoft.HomeServer.HomeServerConsoleTab.ShowTime
{
public partial class ucDemo : UserControl
{
public ucDemo()
{
InitializeComponent();
}
private void ucDemo_Load(object sender, EventArgs e)
{
btRefresh_Click(sender, e);
}
private void btCreer_Click(object sender, EventArgs e)
{
ucPopup_Add dialog = new ucPopup_Add();
dialog.ShowDialog();
btRefresh_Click(sender, e);
try
{
foreach (ListViewItem o_item in ListView1.Items)
{
if ( o_item.Text == dialog.Text )
{
//En faire un ShowTime
o_item.Selected = true;
btAction_Click(sender, e);
//En faire un ShowTime
o_item.Selected = true;
btAction_Click(sender, e);
}
}
btRefresh_Click(sender, e);
}
catch (Exception ex){
MessageBox.Show("Erreur" + ex.Message, "Succes", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btSupprimer_Click(object sender, EventArgs e)
{
Form_suppr dialog = new Form_suppr();
dialog.ShowDialog();
if (dialog.DialogResult.ToString() == "OK" && ListView1.SelectedItems.Count > 0 && ListView1.SelectedItems[0].ImageIndex == 2)
{
string sAppName = ListView1.SelectedItems[0].Text;
System.DirectoryServices.DirectoryEntry iISSchema = new System.DirectoryServices.DirectoryEntry("IIS://" + Environment.MachineName + "/Schema/AppIsolated");
bool bCanCreate = !(iISSchema.Properties["Syntax"].Value.ToString().ToUpper() == "BOOLEAN");
iISSchema.Dispose();
if (bCanCreate)
{
try
{
System.DirectoryServices.DirectoryEntry iISAdmin = new System.DirectoryServices.DirectoryEntry("IIS://" + Environment.MachineName + "/W3SVC/1/Root");
string sWebPath = iISAdmin.Properties["Path"].Value.ToString();
//If the virtual directory already exists then delete it
foreach (System.DirectoryServices.DirectoryEntry vd in iISAdmin.Children)
{
if (vd.Name == sAppName)
{
sWebPath += "\\" + vd.Name;
if (vd.Properties["KeyType"].Value.ToString().Trim() == "IIsWebVirtualDir")
sWebPath = vd.Properties["Path"].Value.ToString();
iISAdmin.Invoke("Delete", new string[] { vd.SchemaClassName, sAppName });
//System.IO.Directory.Delete(sWebPath);
iISAdmin.CommitChanges();
}
}
MessageBox.Show("Le site a été supprimé avec succes.", "Succes", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show("Erreur" + ex.Message, "Succes", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
btRefresh_Click(sender, e);
}
private void btAction_Click(object sender, EventArgs e)
{
if (ListView1.SelectedItems.Count > 0)
{
try
{
if (ListView1.SelectedItems[0].ImageIndex == 2)
{ //on est sur un repertoire showtime donc l'action est : regenere les tags
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = ListView1.SelectedItems[0].SubItems[1].Text + "\\Ressources\\batch.bat";
proc.StartInfo.WorkingDirectory = ListView1.SelectedItems[0].SubItems[1].Text + "\\Ressources\\";
proc.StartInfo.Arguments = "\"" + ListView1.SelectedItems[0].SubItems[1].Text + "\"";
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
proc.Start();
}
else
{ //on est sur un repertoire classique donc l'action est : transformer en showtime
//On devrait avoir apres l'install un repertoire "%program files%/whssoftware/whs showtime/install"
//on va récuperer les fichers de ce repertoire et l'envoyer dans le rep selectionné
DirectoryInfo diSource = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\WhsSoftware\\WHS Showtime\\");
DirectoryInfo diTarget = new DirectoryInfo(ListView1.SelectedItems[0].SubItems[1].Text);
foreach (DirectoryInfo di1 in diSource.GetDirectories())
{
//On copie le rep install & ses sous folders, et on copie
if (di1.Name == "install" || (di1.Name == "sanswhiist" && ListView1.SelectedItems[0].ImageIndex == 0))
{
foreach (FileInfo fi in di1.GetFiles())
{
fi.CopyTo(Path.Combine(diTarget.ToString(), fi.Name), true);
}
foreach (DirectoryInfo di in di1.GetDirectories())
{
diTarget.CreateSubdirectory(di.Name);
foreach (FileInfo fi in di.GetFiles())
{
fi.CopyTo(Path.Combine(diTarget.ToString() + "\\" + di.Name + "\\", fi.Name), true);
}
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Erreur" + ex.Message, "Succes", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
btRefresh_Click(sender, e);
}
private void btRefresh_Click(object sender, EventArgs e)
{
//Fonction regenerant l'ensemble de l'affichage
ListView1.Items.Clear();
ListViewItem item;
string[] files;
//On récupere tous les noms :
System.DirectoryServices.DirectoryEntry IISAdmin;
IISAdmin = new System.DirectoryServices.DirectoryEntry("IIS://" + Environment.MachineName + "/W3SVC/" + 1 + "/Root");
DateTime currentSystemTime = DateTime.Now;
foreach (System.DirectoryServices.DirectoryEntry v in IISAdmin.Children)
{
if (v.Name != "aspnet_client" && v.Name != "Home" && v.Name != "Remote" && v.Name != "Upnp")
{
item = ListView1.Items.Add(v.Name);
try
{
item.ImageIndex = 0;
//ListView1.Items.Add(virtualSub.Properties["Path"].Value.ToString());
files = Directory.GetFiles(v.Properties["Path"].Value.ToString() + "\\", "album.ashx");
item.SubItems.Add(v.Properties["Path"].Value.ToString());
if (files.Length == 1)
{
item.ImageIndex = 1;
}
files = Directory.GetFiles(v.Properties["Path"].Value.ToString() + "\\", "date.asp");
if (files.Length == 1)
{
item.ImageIndex = 2;
FileInfo TheFile = new FileInfo(v.Properties["Path"].Value.ToString() + "\\Ressources\\parse.txt");
if (TheFile.Exists)
{
TimeSpan duration = currentSystemTime - TheFile.LastWriteTime;
if (duration.TotalSeconds < -5) //Peut arriver si on a
{
item.SubItems.Add("Le fichier est obsolète, cliquez sur \"Generer fichier de tags\"");
}
else if (duration.TotalSeconds < 120)
{//Le fichier est super recent
item.SubItems.Add("Le fichier est en construction");
}
else if (duration.TotalHours < 2)
{
item.SubItems.Add("Le fichier de tags a été généré il y a " + Math.Floor(duration.TotalMinutes) + " minutes.");
}
else if (duration.TotalDays < 2)
{
item.SubItems.Add("Le fichier de tags a été généré il y a " + Math.Floor(duration.TotalHours) + " heures.");
}
else
{
item.SubItems.Add("Le fichier date d'il y a plus de " + Math.Floor(duration.TotalDays) + " jours.");
}
}
else
{
item.SubItems.Add("Le fichier de tags n'existe pas, cliquez sur \"Generer fichier de tags\"");
}
}
else
{
item.SubItems.Add("Si vous voulez faire de ce partage un partage Show Time cliquez sur \"Transformer en Showtime\"");
}
//On rajoute l'URL
item.SubItems.Add("http://" + Environment.MachineName + "/" + v.Name + "/");
}
catch (Exception ex)
{
//ListView1.Items.Add("Error in EnumerateWebsites: " + ex.Message);
item.SubItems.Add("Error in EnumerateWebsites: " + ex.Message);
}
}
}
if (ListView1.Items.Count > 0)
{
Texte1.Visible = false;
Texte2.Visible = false;
}
else
{
Texte1.Visible = true;
Texte2.Visible = true;
}
}
private void ListView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
if (ListView1.SelectedItems.Count > 0 && ListView1.SelectedItems[0].ImageIndex == 2)
{
try
{
DateTime currentSystemTime = DateTime.Now;
FileInfo TheFile = new FileInfo(ListView1.SelectedItems[0].SubItems[1].Text + "\\Ressources\\parse.txt");
btAction.Text = " Generer fichiers de tags";
TimeSpan duration = currentSystemTime - TheFile.LastWriteTime;
if (duration.TotalSeconds < 60)
{
//Le fichier est super recent
btSupprimer.Enabled = false;
btAction.Enabled = false;
}
else
{
btSupprimer.Enabled = true;
btAction.Enabled = true;
}
}
catch (Exception ex)
{
//item.SubItems.Add("Error in EnumerateWebsites: " + ex.Message);
}
}
else
{
btAction.Text = " Transformer en Showtime";
btSupprimer.Enabled = true;
btAction.Enabled = true;
}
}
private void btAbout_Click(object sender, EventArgs e)
{
AboutBox1 dialog = new AboutBox1();
dialog.ShowDialog();
}
}
}
Conclusion :
Cet Add-in représente un fragement de ce que je rêverai que WHS soit pour moi : une plateforme complete de stockage, sauvegarde et partage de tous, de manière ludique et impressionnante.
Et pour moi la frise et le géotagging sont 2 pistes intéressantes pour avoir une vue "differente" de nos images.
Malheureusement, il y a encore beaucoup à faire, autant au niveau des fonctionnalités (support des tags GPS standart de géocoding,...) que du design ou du code en lui même (nettoyage du code qui en aurait bien besoin, amélioration des perfs, corrections des petits bugs restants-fichu accents !). Mais le concours ne dure qu'un mois ...
Aussi, n'étant ni developpeur C#, ni Html (je suis dev SAP, je pense que ça se voit dans le code), je suis ouvert à toute aide/conseil ...
Le MSI contient Mes sources, ExifTools (qui est en licence GPL), des icones de Microsoft converties en PNG (j'ai demandé l'autorisation pour l'utilisation dans le cadre du concours) et 2 photo exemples.
Pour plus d'info, aide pour l'installation, description, FAQ ... j'ai monté un site web :
http://totolelex.free.fr/whs
Pour des raisons de limitation de la taille des sources, le MSI installable n'est pas dans le package mais sur le sir
http://totolelex.free.fr/whs/Showtime.msi
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.