ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/DecentralizedMedia/DecentralizedMedia.cpp
Revision: 547
Committed: 2005-07-04T02:47:18-07:00 (19 years, 11 months ago) by douglas
File size: 4034 byte(s)
Log Message:
Meep!

File Contents

# User Rev Content
1 douglas 464 // Decentralized Media
2     //
3     // Douglas Thrift
4     //
5     // $Id$
6    
7 douglas 470 #include <menes/standard.hh>
8 douglas 464
9 douglas 474 #include <menes-api/pcre/regex.hpp>
10 douglas 471 #include <menes-app/simple.hpp>
11 douglas 484 #include <menes-dbi/driver.hpp>
12 douglas 538 #include <menes-hop/bind.hpp>
13 douglas 474 #include <menes-ios/helpers.hpp>
14 douglas 471 #include <menes-net/http/request.hpp>
15     #include <menes-net/http/response.hpp>
16 douglas 507 #include <menes-xml/document.hpp>
17     #include <menes-xml/parse.hpp>
18 douglas 470
19 douglas 471 #include "DecentralizedMedia.hpp"
20 douglas 464
21 douglas 471 int Main(const app::Options& options)
22 douglas 464 {
23 douglas 542 api::Pcre::RegEx extension(_B("^-extension=(.+)$")), local(_B("^-local=(.+)$")), player_("^-player=(.+)$");
24 douglas 534 ext::RedBlackSet<cse::String> extensions;
25 douglas 529 ext::RedBlackSet<api::Path> locals;
26 douglas 542 int player(0);
27 douglas 464
28 douglas 474 _foreach (const app::ArgumentList, arg, app::GetArguments())
29     {
30     api::Pcre::RegEx::Match match;
31    
32     if (match = extension(*arg))
33 douglas 491 extensions.Insert(match[1]);
34 douglas 474 else if (match = local(*arg))
35 douglas 529 locals.Insert(api::Path(match[1]).GetRealPath());
36 douglas 542 else if (match = player_(*arg))
37     player = lexical_cast<int>(match[1]);
38 douglas 474 }
39    
40     if (extensions.IsEmpty())
41 douglas 491 extensions.Insert(_B("mp3"));
42 douglas 474
43 douglas 529 {
44     api::Path media(_B("Media"));
45    
46     if (!media.Exists())
47     media.CreateDirectory();
48    
49     locals.Insert(media.GetRealPath());
50     }
51 douglas 491
52 douglas 542 _S<DecentralizedMedia> media(extensions, locals, player);
53 douglas 474
54 douglas 472 media.Block();
55    
56 douglas 471 return 0;
57     }
58 douglas 469
59 douglas 542 DecentralizedMedia::DecentralizedMedia(const ext::RedBlackSet<cse::String>& extensions, const ext::RedBlackSet<api::Path>& locals, int player) : waf::Server(_B("Web")), connection(dbi::GetDriver("dbi::PgSql::Driver")->Connect("", "douglas", "", "media")), extensions(extensions), library(connection), player(connection, player)
60 douglas 471 {
61 douglas 517 {
62 douglas 534 _L<cse::String> args;
63 douglas 474
64 douglas 534 _foreach (const ext::RedBlackSet<cse::String>, extension, extensions)
65 douglas 507 args.InsertLast(_S<ios::String>() << "-extension=" << *extension);
66 douglas 474
67 douglas 529 _foreach (const ext::RedBlackSet<api::Path>, local, locals)
68 douglas 507 args.InsertLast(_S<ios::String>() << "-local=" << *local);
69 douglas 474
70 douglas 517 _S<api::Process> media(_B("Util/media"), args);
71 douglas 474
72 douglas 517 Media(*media.GetReader());
73 douglas 503
74 douglas 517 media.Join();
75 douglas 474 }
76    
77 douglas 517 {
78 douglas 534 _L<cse::String> args;
79 douglas 517
80     args.InsertLast(_B("-s"));
81     args.InsertLast(_B("object/DecentralizedMedia.hh.gch"));
82    
83     _S<api::Process> make(CFG_GNU_MAKE, args);
84    
85     make.ClearWriter();
86    
87     _S<ios::String> error;
88    
89     ios::ReadToWrite(*make.GetReader(), error);
90    
91     if (make.Join() != 0)
92     throw ext::StringException(error);
93     }
94    
95 douglas 471 AddPort(6996);
96     }
97 douglas 469
98 douglas 471 void DecentralizedMedia::Process(const net::Http::Request& request, net::Http::Response& response)
99     {
100 douglas 547 api::Cout << request.client_ << _B(" ");
101    
102 douglas 531 if (request.method_ == _B("EXTENSIONS"))
103 douglas 474 {
104 douglas 507 api::Cout << "EXTENSIONS" << ios::NewLine;
105    
106 douglas 474 response.SetStatus(200);
107    
108 douglas 534 _foreach (const ext::RedBlackSet<cse::String>, extension, extensions)
109 douglas 476 response << *extension << ios::NewLineNoFlush;
110 douglas 474 }
111 douglas 531 else if (request.method_ == _B("MEDIA"))
112 douglas 474 {
113 douglas 507 api::Cout << "MEDIA" << ios::NewLine;
114    
115 douglas 508 if (!request.content_.IsEmpty())
116 douglas 509 {
117 douglas 542 api::InternetAddress host(request.client_);
118 douglas 508
119 douglas 542 host.SetPort(6996);
120    
121     Media(*request.content_, host);
122    
123 douglas 509 response.SetStatus(204);
124     }
125     else
126 douglas 531 response.SetStatus(411);
127 douglas 474 }
128 douglas 471 else
129     waf::Server::Process(request, response);
130     }
131 douglas 507
132 douglas 547 void DecentralizedMedia::Media(ios::Reader& media, const api::Address& host)
133 douglas 507 {
134 douglas 541 _R<xml::Document> document(xml::Parse(media));
135 douglas 531 api::Pcre::RegEx share("^[0-9a-f]+$");
136 douglas 507
137     _foreach (const xml::NodeSet, folder, *document/"media"/"folder")
138     {
139 douglas 534 cse::String path(**folder/"path");
140 douglas 507
141 douglas 514 if (api::Pcre::RegEx::Match match = share(path))
142     {
143 douglas 541 _R<Share> share(new _H<Share>(connection, host, match[0]));
144 douglas 514
145     path = share->path.GetPath();
146    
147 douglas 542 player.Add(share);
148 douglas 514 }
149    
150     Media(*folder, path, path);
151 douglas 507 }
152     }
153    
154 douglas 541 void DecentralizedMedia::Media(const _R<xml::Node>& folder, const api::Path& path, const api::Path& root)
155 douglas 507 {
156     MediaFolder(connection, path, root);
157    
158     _foreach (const xml::NodeSet, file, *folder/"file")
159     MediaFile(connection, path.GetChild(**file/"path"), **file/"artist", **file/"title", **file/"album", **file/"genre", root);
160    
161     _foreach (const xml::NodeSet, folder_, *folder/"folder")
162     Media(*folder_, path.GetChild(**folder_/"path"), root);
163     }

Properties

Name Value
svn:eol-style native
svn:keywords Id