Merge pull request #2083 from TeamNewPipe/ccc

Add MediaCCC support
This commit is contained in:
Christian Schabesberger 2019-02-05 18:28:22 +01:00 committed by GitHub
commit 5fb0729eae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 214 additions and 49 deletions

View File

@ -57,7 +57,7 @@ dependencies {
exclude module: 'support-annotations'
})
implementation 'com.github.TeamNewPipe:NewPipeExtractor:f7c7b9df1a'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:79b0a19d1af'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:2.23.0'

View File

@ -55,6 +55,7 @@ import org.schabi.newpipe.ReCaptchaActivity;
import org.schabi.newpipe.download.DownloadDialog;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.ServiceList;
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor;
@ -362,7 +363,8 @@ public class VideoDetailFragment
}
break;
case R.id.detail_controls_download:
if (PermissionHelper.checkStoragePermissions(activity, PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) {
if (PermissionHelper.checkStoragePermissions(activity,
PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) {
this.openDownloadDialog();
}
break;
@ -446,7 +448,6 @@ public class VideoDetailFragment
return;
}
//Log.d(TAG, "toggleExpandRelatedVideos() called with: info = [" + info + "], from = [" + INITIAL_RELATED_VIDEOS + "]");
for (int i = INITIAL_RELATED_VIDEOS; i < info.getRelatedStreams().size(); i++) {
InfoItem item = info.getRelatedStreams().get(i);
//Log.d(TAG, "i = " + i);
@ -519,7 +520,9 @@ public class VideoDetailFragment
infoItemBuilder.setOnStreamSelectedListener(new OnClickGesture<StreamInfoItem>() {
@Override
public void selected(StreamInfoItem selectedItem) {
selectAndLoadVideo(selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName());
selectAndLoadVideo(selectedItem.getServiceId(),
selectedItem.getUrl(),
selectedItem.getName());
}
@Override
@ -699,13 +702,13 @@ public class VideoDetailFragment
switch (id) {
case R.id.menu_item_share: {
if (currentInfo != null) {
shareUrl(currentInfo.getName(), currentInfo.getUrl());
shareUrl(currentInfo.getName(), currentInfo.getOriginalUrl());
}
return true;
}
case R.id.menu_item_openInBrowser: {
if (currentInfo != null) {
openUrlInBrowser(currentInfo.getUrl());
openUrlInBrowser(currentInfo.getOriginalUrl());
}
return true;
}
@ -742,10 +745,16 @@ public class VideoDetailFragment
boolean isExternalPlayerEnabled = PreferenceManager.getDefaultSharedPreferences(activity)
.getBoolean(activity.getString(R.string.use_external_video_player_key), false);
sortedVideoStreams = ListHelper.getSortedStreamVideosList(activity, info.getVideoStreams(), info.getVideoOnlyStreams(), false);
sortedVideoStreams = ListHelper.getSortedStreamVideosList(
activity,
info.getVideoStreams(),
info.getVideoOnlyStreams(),
false);
selectedVideoStreamIndex = ListHelper.getDefaultResolutionIndex(activity, sortedVideoStreams);
final StreamItemAdapter<VideoStream, Stream> streamsAdapter = new StreamItemAdapter<>(activity, new StreamSizeWrapper<>(sortedVideoStreams, activity), isExternalPlayerEnabled);
final StreamItemAdapter<VideoStream, Stream> streamsAdapter =
new StreamItemAdapter<>(activity,
new StreamSizeWrapper<>(sortedVideoStreams, activity), isExternalPlayerEnabled);
spinnerToolbar.setAdapter(streamsAdapter);
spinnerToolbar.setSelection(selectedVideoStreamIndex);
spinnerToolbar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@ -770,17 +779,17 @@ public class VideoDetailFragment
*/
protected final LinkedList<StackItem> stack = new LinkedList<>();
public void clearHistory() {
stack.clear();
}
public void pushToStack(int serviceId, String videoUrl, String name) {
if (DEBUG) {
Log.d(TAG, "pushToStack() called with: serviceId = [" + serviceId + "], videoUrl = [" + videoUrl + "], name = [" + name + "]");
Log.d(TAG, "pushToStack() called with: serviceId = ["
+ serviceId + "], videoUrl = [" + videoUrl + "], name = [" + name + "]");
}
if (stack.size() > 0 && stack.peek().getServiceId() == serviceId && stack.peek().getUrl().equals(videoUrl)) {
Log.d(TAG, "pushToStack() called with: serviceId == peek.serviceId = [" + serviceId + "], videoUrl == peek.getUrl = [" + videoUrl + "]");
if (stack.size() > 0
&& stack.peek().getServiceId() == serviceId
&& stack.peek().getUrl().equals(videoUrl)) {
Log.d(TAG, "pushToStack() called with: serviceId == peek.serviceId = ["
+ serviceId + "], videoUrl == peek.getUrl = [" + videoUrl + "]");
return;
} else {
Log.d(TAG, "pushToStack() wasn't equal");
@ -811,7 +820,11 @@ public class VideoDetailFragment
// Get stack item from the new top
StackItem peek = stack.peek();
selectAndLoadVideo(peek.getServiceId(), peek.getUrl(), !TextUtils.isEmpty(peek.getTitle()) ? peek.getTitle() : "");
selectAndLoadVideo(peek.getServiceId(),
peek.getUrl(),
!TextUtils.isEmpty(peek.getTitle())
? peek.getTitle()
: "");
return true;
}
@ -831,9 +844,10 @@ public class VideoDetailFragment
}
public void prepareAndHandleInfo(final StreamInfo info, boolean scrollToTop) {
if (DEBUG) Log.d(TAG, "prepareAndHandleInfo() called with: info = [" + info + "], scrollToTop = [" + scrollToTop + "]");
if (DEBUG) Log.d(TAG, "prepareAndHandleInfo() called with: info = ["
+ info + "], scrollToTop = [" + scrollToTop + "]");
setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName());
setInitialData(info.getServiceId(), info.getUrl(), info.getName());
pushToStack(serviceId, url, name);
showLoading();
@ -1026,7 +1040,8 @@ public class VideoDetailFragment
private void showContentWithAnimation(long duration,
long delay,
@FloatRange(from = 0.0f, to = 1.0f) float translationPercent) {
@FloatRange(from = 0.0f, to = 1.0f)
float translationPercent) {
int translationY = (int) (getResources().getDisplayMetrics().heightPixels *
(translationPercent > 0.0f ? translationPercent : .06f));
@ -1134,7 +1149,7 @@ public class VideoDetailFragment
super.handleResult(info);
setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName());
pushToStack(serviceId, url, name);
//pushToStack(serviceId, url, name);
animateView(thumbnailPlayButton, true, 200);
videoTitleTextView.setText(name);
@ -1185,11 +1200,13 @@ public class VideoDetailFragment
if (info.getDuration() > 0) {
detailDurationView.setText(Localization.getDurationString(info.getDuration()));
detailDurationView.setBackgroundColor(ContextCompat.getColor(activity, R.color.duration_background_color));
detailDurationView.setBackgroundColor(
ContextCompat.getColor(activity, R.color.duration_background_color));
animateView(detailDurationView, true, 100);
} else if (info.getStreamType() == StreamType.LIVE_STREAM) {
detailDurationView.setText(R.string.duration_live);
detailDurationView.setBackgroundColor(ContextCompat.getColor(activity, R.color.live_duration_background_color));
detailDurationView.setBackgroundColor(
ContextCompat.getColor(activity, R.color.live_duration_background_color));
animateView(detailDurationView, true, 100);
} else {
detailDurationView.setVisibility(View.GONE);
@ -1269,10 +1286,18 @@ public class VideoDetailFragment
downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog");
} catch (Exception e) {
Toast.makeText(activity,
R.string.could_not_setup_download_menu,
Toast.LENGTH_LONG).show();
e.printStackTrace();
ErrorActivity.ErrorInfo info = ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR,
ServiceList.all()
.get(currentInfo
.getServiceId())
.getServiceInfo()
.getName(), "",
R.string.could_not_setup_download_menu);
ErrorActivity.reportError(getActivity(),
e,
getActivity().getClass(),
getActivity().findViewById(android.R.id.content), info);
}
}

View File

@ -233,10 +233,10 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
openRssFeed();
break;
case R.id.menu_item_openInBrowser:
openUrlInBrowser(url);
openUrlInBrowser(currentInfo.getOriginalUrl());
break;
case R.id.menu_item_share:
shareUrl(name, url);
shareUrl(name, currentInfo.getOriginalUrl());
break;
default:
return super.onOptionsItemSelected(item);

View File

@ -104,8 +104,13 @@ public class SearchFragment
// this three represet the current search query
@State
protected String searchString;
/**
* No content filter should add like contentfilter = all
* be aware of this when implementing an extractor.
*/
@State
protected String[] contentFilter;
protected String[] contentFilter = new String[0];
@State
protected String sortFilter;
@ -335,7 +340,7 @@ public class SearchFragment
|| (searchEditText != null && !TextUtils.isEmpty(searchEditText.getText()))) {
search(!TextUtils.isEmpty(searchString)
? searchString
: searchEditText.getText().toString(), new String[0], "");
: searchEditText.getText().toString(), this.contentFilter, "");
} else {
if (searchEditText != null) {
searchEditText.setText("");
@ -736,6 +741,7 @@ public class SearchFragment
@Override
protected void loadMoreItems() {
if(nextPageUrl == null || nextPageUrl.isEmpty()) return;
isLoading.set(true);
showListFooter(true);
if (searchDisposable != null) searchDisposable.dispose();

View File

@ -93,15 +93,17 @@ public class VideoPlaybackResolver implements PlaybackResolver {
// Below are auxiliary media sources
// Create subtitle sources
for (final SubtitlesStream subtitle : info.getSubtitles()) {
final String mimeType = PlayerHelper.subtitleMimeTypesOf(subtitle.getFormat());
if (mimeType == null) continue;
if(info.getSubtitles() != null) {
for (final SubtitlesStream subtitle : info.getSubtitles()) {
final String mimeType = PlayerHelper.subtitleMimeTypesOf(subtitle.getFormat());
if (mimeType == null) continue;
final Format textFormat = Format.createTextSampleFormat(null, mimeType,
SELECTION_FLAG_AUTOSELECT, PlayerHelper.captionLanguageOf(context, subtitle));
final MediaSource textSource = dataSource.getSampleMediaSourceFactory()
.createMediaSource(Uri.parse(subtitle.getURL()), textFormat, TIME_UNSET);
mediaSources.add(textSource);
final Format textFormat = Format.createTextSampleFormat(null, mimeType,
SELECTION_FLAG_AUTOSELECT, PlayerHelper.captionLanguageOf(context, subtitle));
final MediaSource textSource = dataSource.getSampleMediaSourceFactory()
.createMediaSource(Uri.parse(subtitle.getURL()), textFormat, TIME_UNSET);
mediaSources.add(textSource);
}
}
if (mediaSources.size() == 1) {

View File

@ -31,6 +31,7 @@ import org.schabi.newpipe.ReCaptchaActivity;
import org.schabi.newpipe.extractor.Info;
import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.SuggestionExtractor;
import org.schabi.newpipe.extractor.channel.ChannelInfo;
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
@ -46,6 +47,7 @@ import org.schabi.newpipe.report.UserAction;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.util.Collections;
import java.util.List;
import io.reactivex.Maybe;
@ -95,10 +97,13 @@ public final class ExtractorHelper {
public static Single<List<String>> suggestionsFor(final int serviceId,
final String query) {
checkServiceId(serviceId);
return Single.fromCallable(() ->
NewPipe.getService(serviceId)
.getSuggestionExtractor()
.suggestionList(query));
return Single.fromCallable(() -> {
SuggestionExtractor extractor = NewPipe.getService(serviceId)
.getSuggestionExtractor();
return extractor != null
? extractor.suggestionList(query)
: Collections.emptyList();
});
}
public static Single<StreamInfo> getStreamInfo(final int serviceId,

View File

@ -31,6 +31,8 @@ public class KioskTranslator {
return c.getString(R.string.top_50);
case "New & hot":
return c.getString(R.string.new_and_hot);
case "conferences":
return c.getString(R.string.conferences);
default:
return kioskId;
}
@ -44,6 +46,8 @@ public class KioskTranslator {
return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot);
case "New & hot":
return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot);
case "conferences":
return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot);
default:
return 0;
}

View File

@ -24,9 +24,11 @@ public class ServiceHelper {
case 0:
return R.drawable.place_holder_youtube;
case 1:
return R.drawable.place_holder_circle;
return R.drawable.place_holder_cloud;
case 2:
return R.drawable.place_holder_gadse;
default:
return R.drawable.service;
return R.drawable.place_holder_circle;
}
}
@ -38,6 +40,8 @@ public class ServiceHelper {
case "playlists": return c.getString(R.string.playlists);
case "tracks": return c.getString(R.string.tracks);
case "users": return c.getString(R.string.users);
case "conferences" : return c.getString(R.string.conferences);
case "events" : return c.getString(R.string.events);
default: return filter;
}
}

View File

@ -28,7 +28,8 @@ import io.reactivex.schedulers.Schedulers;
import us.shandian.giga.util.Utility;
/**
* A list adapter for a list of {@link Stream streams}, currently supporting {@link VideoStream} and {@link AudioStream}.
* A list adapter for a list of {@link Stream streams},
* currently supporting {@link VideoStream}, {@link AudioStream} and {@link SubtitlesStream}
*/
public class StreamItemAdapter<T extends Stream, U extends Stream> extends BaseAdapter {
private final Context context;
@ -110,7 +111,10 @@ public class StreamItemAdapter<T extends Stream, U extends Stream> extends BaseA
}
}
} else if (stream instanceof AudioStream) {
qualityString = ((AudioStream) stream).getAverageBitrate() + "kbps";
AudioStream audioStream = ((AudioStream) stream);
qualityString = audioStream.getAverageBitrate() > 0
? audioStream.getAverageBitrate() + "kbps"
: audioStream.getFormat().getName();
} else if (stream instanceof SubtitlesStream) {
qualityString = ((SubtitlesStream) stream).getDisplayLanguageName();
if (((SubtitlesStream) stream).isAutoGenerated()) {
@ -154,8 +158,10 @@ public class StreamItemAdapter<T extends Stream, U extends Stream> extends BaseA
private final long[] streamSizes;
private final String unknownSize;
public StreamSizeWrapper(List<T> streamsList, Context context) {
this.streamsList = streamsList;
public StreamSizeWrapper(List<T> sL, Context context) {
this.streamsList = sL != null
? sL
: Collections.emptyList();
this.streamSizes = new long[streamsList.size()];
this.unknownSize = context == null ? "--.-" : context.getString(R.string.unknown_content);

View File

@ -137,7 +137,9 @@ public class ThemeHelper {
else if (selectedTheme.equals(darkTheme)) themeName = "DarkTheme";
themeName += "." + service.getServiceInfo().getName();
int resourceId = context.getResources().getIdentifier(themeName, "style", context.getPackageName());
int resourceId = context
.getResources()
.getIdentifier(themeName, "style", context.getPackageName());
if (resourceId > 0) {
return resourceId;

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -31,4 +31,22 @@
<item name="colorAccent">@color/dark_soundcloud_accent_color</item>
</style>
<!-- Media.ccc -->
<style name="LightTheme.MediaCCC" parent="LightTheme.Switchable">
<item name="colorPrimary">@color/light_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/light_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/light_media_ccc_accent_color</item>
</style>
<style name="DarkTheme.MediaCCC" parent="DarkTheme.Switchable">
<item name="colorPrimary">@color/dark_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/dark_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/dark_media_ccc_accent_color</item>
</style>
<style name="BlackTheme.MediaCCC" parent="BlackTheme.Switchable">
<item name="colorPrimary">@color/dark_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/dark_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/dark_media_ccc_accent_color</item>
</style>
</resources>

View File

@ -22,4 +22,15 @@
<color name="dark_soundcloud_accent_color">#FFFFFF</color>
<color name="dark_soundcloud_statusbar_color">#ff9100</color>
<!-- Media.CCC -->
<color name="light_media_ccc_primary_color">#9e9e9e</color>
<color name="light_media_ccc_dark_color">#616161</color>
<color name="light_media_ccc_accent_color">#000000</color>
<color name="light_media_ccc_statusbar_color">#afafaf</color>
<color name="dark_media_ccc_primary_color">#9e9e9e</color>
<color name="dark_media_ccc_dark_color">#616161</color>
<color name="dark_media_ccc_accent_color">#FFFFFF</color>
<color name="dark_media_ccc_statusbar_color">#afafaf</color>
</resources>

View File

@ -137,6 +137,7 @@
<string name="videos">Videos</string>
<string name="tracks">Tracks</string>
<string name="users">Users</string>
<string name="events">Events</string>
<string name="yes">Yes</string>
<string name="later">Later</string>
<string name="disabled">Disabled</string>
@ -396,6 +397,7 @@
<string name="trending">Trending</string>
<string name="top_50">Top 50</string>
<string name="new_and_hot">New &amp; hot</string>
<string name="conferences">Conferences</string>
<string name="service_kiosk_string" translatable="false">%1$s/%2$s</string>
<!-- Play Queue -->

View File

@ -9,6 +9,7 @@
<style name="BlackTheme.YouTube" parent="BlackTheme.Switchable">
</style>
<!-- SoundCloud -->
<style name="LightTheme.SoundCloud" parent="LightTheme.Switchable">
<item name="colorPrimary">@color/light_soundcloud_primary_color</item>
@ -28,4 +29,23 @@
<item name="colorAccent">@color/dark_soundcloud_accent_color</item>
</style>
<!-- Media.ccc -->
<style name="LightTheme.MediaCCC" parent="LightTheme.Switchable">
<item name="colorPrimary">@color/light_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/light_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/light_media_ccc_accent_color</item>
</style>
<style name="DarkTheme.MediaCCC" parent="DarkTheme.Switchable">
<item name="colorPrimary">@color/dark_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/dark_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/dark_media_ccc_accent_color</item>
</style>
<style name="BlackTheme.MediaCCC" parent="BlackTheme.Switchable">
<item name="colorPrimary">@color/dark_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/dark_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/dark_media_ccc_accent_color</item>
</style>
</resources>

60
assets/media_gadse.svg Normal file
View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="45.658001"
height="45.658001"
viewBox="0 0 12.080347 12.080406"
version="1.1"
id="svg6"
sodipodi:docname="media_gadse.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
inkscape:export-filename="/home/the-scrabi/Projects/NewPipe/assets/media_gadse.svg.png"
inkscape:export-xdpi="1076"
inkscape:export-ydpi="1076">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="737"
id="namedview8"
showgrid="false"
inkscape:zoom="7.6782421"
inkscape:cx="-1.1928166"
inkscape:cy="24.349191"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg6" />
<path
d="m 6.0768689,0.5299995 c -3.2341126,5.5189e-4 -5.85589584,2.6218874 -5.85700002,5.8559999 -1.8224e-4,0.7096349 0.12857558,1.4133981 0.38,2.077 0.086,-0.224 0.184,-0.444 0.308,-0.65 0.064,-0.105 0.13300002,-0.206 0.18000002,-0.32 0.051001,-0.1118859 0.06229,-0.2378274 0.032,-0.357 -0.022811,-0.065881 -0.056623,-0.1274188 -0.1,-0.182 -0.04,-0.056 -0.087,-0.11 -0.12400002,-0.168 -0.0973187,-0.1496106 -0.13809421,-0.3290228 -0.115,-0.506 0.0249628,-0.1774484 0.11915931,-0.3377983 0.26200002,-0.446 0.1294714,-0.092188 0.2862622,-0.1379925 0.445,-0.13 0.052534,0.00149 0.10479,0.00819 0.156,0.02 0.2053261,0.054599 0.3876405,0.1738048 0.52,0.34 0.165,0.202 0.262,0.457 0.286,0.717 0.024,0.26 -0.024,0.525 -0.124,0.766 -0.18,0.432 -0.52,0.78 -0.707,1.208 -0.152,0.35 -0.196,0.74 -0.175,1.122 0.003,0.035 0.008,0.07 0.01,0.106 0.4507334,0.5770346 1.0056516,1.0644546 1.636,1.4370006 -0.038078,-0.316572 -0.057112,-0.635146 -0.057,-0.954 0,-0.254 0.014,-0.5070006 0.038,-0.7570006 -0.1559054,-0.101895 -0.2893089,-0.2346178 -0.392,-0.39 -0.177,-0.28 -0.21,-0.635 -0.138,-0.96 0.073,-0.323 0.245,-0.618 0.45,-0.878 0.343398,-0.4301031 0.7823519,-0.7742129 1.282,-1.005 -0.014,-0.02 -0.03,-0.04 -0.04,-0.056 -0.1827732,-0.2976652 -0.2917986,-0.6346839 -0.318,-0.983 -0.026,-0.35 0.03,-0.703 0.052,-1.053 0.017,-0.245 0.018,-0.49 0.032,-0.735 0.017,-0.285 0.05,-0.568 0.13,-0.84 0.03,-0.1 0.065,-0.198 0.12,-0.284 0.065809,-0.1019387 0.159529,-0.1828158 0.27,-0.233 0.1103449,-0.046895 0.2319198,-0.060789 0.35,-0.04 0.1,0.022 0.192,0.072 0.273,0.134 0.082,0.062 0.152,0.138 0.218,0.215 0.1881609,0.2215513 0.3461975,0.4670124 0.47,0.73 0.1633637,-0.025246 0.3296363,-0.025246 0.493,0 0.1237511,-0.2630161 0.2817919,-0.5084837 0.47,-0.73 0.066,-0.078 0.136,-0.153 0.217,-0.215 0.079958,-0.064114 0.1732297,-0.1095538 0.273,-0.133 0.1189329,-0.024401 0.2425425,-0.010394 0.353,0.04 0.1097052,0.050551 0.2026866,0.1313891 0.268,0.233 0.057,0.086 0.092,0.184 0.12,0.283 0.08,0.272 0.115,0.556 0.132,0.84 0.014,0.244 0.015,0.49 0.032,0.734 0.023,0.35 0.08,0.702 0.052,1.053 -0.026083,0.3486523 -0.1351111,0.6860228 -0.318,0.984 -0.014,0.023 -0.03,0.044 -0.046,0.066 0.11,0.126 0.27,0.232 0.406,0.278 0.1529159,0.049547 0.3164474,0.056461 0.473,0.02 0.086478,-0.019618 0.1687655,-0.054497 0.243,-0.103 0.07379,-0.047833 0.135419,-0.1122013 0.18,-0.188 0.049414,-0.096424 0.078676,-0.2018999 0.086,-0.31 0.03,-0.275 0,-0.553 -0.024,-0.83 -0.015,-0.178 -0.028,-0.36 0.012,-0.535 0.023795,-0.1205425 0.082982,-0.2312563 0.17,-0.318 0.059653,-0.054775 0.1317196,-0.09424 0.21,-0.115 0.078274,-0.02067 0.1599513,-0.025095 0.24,-0.013 0.1733921,0.025417 0.3282341,0.1222381 0.4270001,0.267 0.05299,0.082963 0.08965,0.1752835 0.108,0.272 0.02,0.097 0.027,0.195 0.032,0.294 0.02,0.343 0.018,0.687 0.008,1.03 -0.008,0.302 -0.025,0.61 -0.145,0.886 -0.154,0.353 -0.4660001,0.617 -0.8000001,0.806 -0.2264625,0.1268843 -0.4675832,0.2256162 -0.718,0.294 0.2220702,0.7271828 0.3333186,1.4836724 0.33,2.2440006 -6.104e-4,0.320918 -0.020647,0.641504 -0.06,0.96 C 10.838809,10.373192 11.935418,8.4567876 11.937869,6.3849994 11.936213,3.1493244 9.3115436,0.52778961 6.0758689,0.5299995 Z"
id="path2"
inkscape:connector-curvature="0"
style="fill:#ffffff"
sodipodi:nodetypes="cccccccccccccscccccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB