Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save WentsingNee/b760ed6a1b6c85ba932ef171ad4aca83 to your computer and use it in GitHub Desktop.
Save WentsingNee/b760ed6a1b6c85ba932ef171ad4aca83 to your computer and use it in GitHub Desktop.
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CMake" type="CPP_MODULE" version="4" />
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<Objective-C-extensions>
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
</class>
<extensions>
<pair source="cpp" header="h" fileNamingConvention="NONE" />
<pair source="c" header="h" fileNamingConvention="NONE" />
</extensions>
</Objective-C-extensions>
</code_scheme>
</component>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/BingWallpaperCpp.iml" filepath="$PROJECT_DIR$/.idea/BingWallpaperCpp.iml" />
</modules>
</component>
</project>
cmake_minimum_required(VERSION 3.12)
project(BingWallpaperCpp)
set(CMAKE_CXX_STANDARD 17)
add_executable(BingWallpaperCpp main.cpp)
target_link_libraries(BingWallpaperCpp -lcpr -lpthread)
#include <cpr/cpr.h>
#include <nlohmann/json.hpp>
#include <kerbal/container/array.hpp>
#include <kerbal/container/flat_ordered.hpp>
#include <iostream>
#include <fstream>
#include <thread>
#include <mutex>
#include <filesystem>
struct BingImg
{
std::string startdate;
std::string url;
std::string copyright;
std::string copyrightlink;
std::string hsh;
};
struct BingImgExtract
{
const std::string & operator()(const BingImg & img) const noexcept
{
return img.startdate;
}
};
using BingImgSet = kerbal::container::flat_ordered<BingImg, std::string, std::less<std::string>, BingImgExtract>;
BingImgSet getBingImgSet()
{
using MaxNum = kerbal::type_traits::integral_constant<size_t, 10>;
BingImgSet bingImgSet; {
bingImgSet.reserve(MaxNum::value);
}
std::mutex bingImgSetMutex;
kerbal::container::array<std::thread, MaxNum::value> threads;
for (size_t i = 0; i < threads.max_size(); ++i) {
std::thread & thread = threads[i];
thread = std::thread([i, &bingImgSet, &bingImgSetMutex](){
auto r = cpr::Get(cpr::Url{"https://www.bing.com/HPImageArchive.aspx"},
cpr::Parameters{
{"format", "js"},
{"idx", std::to_string(i + 1)},
{"n", "1"},
{"mkt", "en-Us"}
});
const nlohmann::json json = nlohmann::json::parse(r.text);
const auto &img = json["images"][0];
std::lock_guard<std::mutex> guard(bingImgSetMutex);
bingImgSet.unique_insert(BingImg{
.startdate = img["startdate"],
.url = "http://www.bing.com/" + (std::string)img["url"],
.copyright = img["copyright"],
.copyrightlink = img["copyrightlink"],
.hsh = img["hsh"],
});
});
}
for (std::thread & thread : threads) {
thread.join();
}
return bingImgSet;
}
int main()
{
using std::cout;
using std::endl;
BingImgSet bingImgSet = getBingImgSet();
cout << "download: " << bingImgSet.size() << " pictures" << endl;
cout << endl;
std::filesystem::create_directories("./img");
for (const auto &e : bingImgSet) {
cout << "startdate: " << e.startdate << "\n"
<< "copyright: " << e.copyright << "\n"
<< "url: " << e.url << "\n"
<< "search: " << e.copyrightlink << "\n"
<< "hsh: " << e.hsh << "\n";
auto r = cpr::Get(cpr::Url{e.url});
std::ofstream img("./img/" + e.startdate + ".jpg", std::ios::out);
img << r.text << std::flush;
cout << endl;
}
}

Tiny C++ Script of Downloading Bing Wallpaper

This project is inspired by hejianjiao/BingWallpaper.

Requirements

  • a C++17 compatible compiler such as GCC or Clang.
  • CMake (recommended).
  • Kerbal, a C++ template library written by me. (If you like it, please give me a star ^_^ )
  • CPR, a simple C++ wrapper around libcurl.
  • nlohmann json, a C++ JSON parser.

Note

If your GCC version is under 9.1.0 (7.x, 8.x, etc.), you need to link libstdc++fs.a .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment